module Manatee.Toolkit.General.Seq where
import Data.Sequence (Seq, (><), (<|), (|>), findIndexL, adjust)
import qualified Data.Sequence as Seq
filterMin :: (a -> Bool) -> Seq a -> Maybe a
filterMin f seq
| Seq.null filterSeq
= Nothing
| otherwise
= Just $ Seq.index filterSeq 0
where filterSeq = Seq.filter f seq
maybeIndex :: Seq a -> Int -> Maybe a
maybeIndex seq index
| index < min || index > max
= Nothing
| otherwise
= Just $ Seq.index seq index
where
min = 0
max = Seq.length seq 1
insertAt :: Int -> a -> Seq a -> Seq a
insertAt n x xs = ys >< (x <| zs)
where
(ys, zs) = Seq.splitAt n xs
deleteAt :: Int -> Seq a -> Seq a
deleteAt n xs = ys >< Seq.drop 1 zs
where
(ys, zs) = Seq.splitAt n xs
swap :: Int -> Int -> Seq a -> Seq a
swap deleteId insertId xs
| deleteId < min || deleteId > max = xs
| insertId < min || insertId > max = xs
| otherwise = zs
where
min = 0
max = Seq.length xs 1
x = Seq.index xs deleteId
ys = deleteAt deleteId xs
zs = insertAt insertId x ys
deleteMatch :: (a -> Bool) -> Seq a -> Seq a
deleteMatch f seq = newSeq
where index = findIndexL f seq
newSeq = case index of
Just i -> deleteAt i seq
Nothing -> seq
tryReplace :: (a -> Bool) -> a -> Seq a -> Seq a
tryReplace f a seq =
case findIndexL f seq of
Just i -> adjust (const a) i seq
Nothing -> seq
replaceOrAdd :: (a -> Bool) -> a -> Seq a -> Seq a
replaceOrAdd f a seq =
case findIndexL f seq of
Just i -> adjust (const a) i seq
Nothing -> (|>) seq a