{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Data.Sequence.ToolsYj (

	cons, snoc, uncons, unsnoc,

	splitAt'

	) where

import Data.Sequence qualified as Seq

cons :: a -> Seq.Seq a -> Seq.Seq a
cons :: forall a. a -> Seq a -> Seq a
cons = a -> Seq a -> Seq a
forall a. a -> Seq a -> Seq a
(Seq.:<|)

snoc :: Seq.Seq a -> a -> Seq.Seq a
snoc :: forall a. Seq a -> a -> Seq a
snoc = Seq a -> a -> Seq a
forall a. Seq a -> a -> Seq a
(Seq.:|>)

uncons :: Seq.Seq a -> Maybe (a, Seq.Seq a)
uncons :: forall a. Seq a -> Maybe (a, Seq a)
uncons = \case Seq a
Seq.Empty -> Maybe (a, Seq a)
forall a. Maybe a
Nothing; a
x Seq.:<| Seq a
s -> (a, Seq a) -> Maybe (a, Seq a)
forall a. a -> Maybe a
Just (a
x, Seq a
s)

unsnoc :: Seq.Seq a -> Maybe (Seq.Seq a, a)
unsnoc :: forall a. Seq a -> Maybe (Seq a, a)
unsnoc = \case Seq a
Seq.Empty -> Maybe (Seq a, a)
forall a. Maybe a
Nothing; Seq a
s Seq.:|> a
x -> (Seq a, a) -> Maybe (Seq a, a)
forall a. a -> Maybe a
Just (Seq a
s, a
x)

splitAt' :: Int -> Seq.Seq a -> Maybe (Seq.Seq a, Seq.Seq a)
splitAt' :: forall a. Int -> Seq a -> Maybe (Seq a, Seq a)
splitAt' Int
n Seq a
s
	| Seq a -> Int
forall a. Seq a -> Int
Seq.length Seq a
s Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = Maybe (Seq a, Seq a)
forall a. Maybe a
Nothing
	| Bool
otherwise = (Seq a, Seq a) -> Maybe (Seq a, Seq a)
forall a. a -> Maybe a
Just ((Seq a, Seq a) -> Maybe (Seq a, Seq a))
-> (Seq a, Seq a) -> Maybe (Seq a, Seq a)
forall a b. (a -> b) -> a -> b
$ Int -> Seq a -> (Seq a, Seq a)
forall a. Int -> Seq a -> (Seq a, Seq a)
Seq.splitAt Int
n Seq a
s