module Taskell.Data.Seq where

import ClassyPrelude

import Data.Sequence (deleteAt, insertAt, mapWithIndex, (!?))

(<#>) :: (Int -> a -> b) -> Seq a -> Seq b
<#> :: (Int -> a -> b) -> Seq a -> Seq b
(<#>) = (Int -> a -> b) -> Seq a -> Seq b
forall a b. (Int -> a -> b) -> Seq a -> Seq b
mapWithIndex

extract :: Int -> Seq a -> Maybe (Seq a, a)
extract :: Int -> Seq a -> Maybe (Seq a, a)
extract Int
idx Seq a
xs = (,) (Int -> Seq a -> Seq a
forall a. Int -> Seq a -> Seq a
deleteAt Int
idx Seq a
xs) (a -> (Seq a, a)) -> Maybe a -> Maybe (Seq a, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Seq a
xs Seq a -> Int -> Maybe a
forall a. Seq a -> Int -> Maybe a
!? Int
idx

shiftBy :: Int -> Int -> Seq a -> Maybe (Seq a)
shiftBy :: Int -> Int -> Seq a -> Maybe (Seq a)
shiftBy Int
idx Int
dir Seq a
xs = do
    (Seq a
a, a
current) <- Int -> Seq a -> Maybe (Seq a, a)
forall a. Int -> Seq a -> Maybe (Seq a, a)
extract Int
idx Seq a
xs
    Seq a -> Maybe (Seq a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Seq a -> Maybe (Seq a)) -> Seq a -> Maybe (Seq a)
forall a b. (a -> b) -> a -> b
$ Int -> a -> Seq a -> Seq a
forall a. Int -> a -> Seq a -> Seq a
insertAt (Int
idx Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
dir) a
current Seq a
a

bound :: Seq a -> Int -> Int
bound :: Seq a -> Int -> Int
bound Seq a
s Int
i
    | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = Int
0
    | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Seq a -> Int
forall mono. MonoFoldable mono => mono -> Int
length Seq a
s = Int -> Int
forall a. Enum a => a -> a
pred (Seq a -> Int
forall mono. MonoFoldable mono => mono -> Int
length Seq a
s)
    | Bool
otherwise = Int
i