{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module Data.Sequences where
import Data.Maybe (fromJust, fromMaybe, isJust)
import Data.Monoid (Monoid, mconcat, mempty, (<>))
import Data.MonoTraversable
import Data.Int (Int64, Int)
import qualified Data.List as List
import qualified Data.List.Split as List
import qualified Control.Monad (filterM, replicateM)
import Prelude (Bool (..), Monad (..), Maybe (..), Ordering (..), Ord (..), Eq (..), Functor (..), fromIntegral, otherwise, (-), fst, snd, Integral, ($), flip, maybe, error, (||))
import Data.Char (Char, isSpace)
import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Control.Category
import Control.Arrow ((***), first, second)
import Control.Monad (liftM)
import qualified Data.Sequence as Seq
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Storable as VS
import Data.String (IsString)
import qualified Data.List.NonEmpty as NE
import qualified Data.ByteString.Unsafe as SU
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Algorithms.Merge as VAM
import Data.Ord (comparing)
import qualified Data.Text.Encoding as T
import qualified Data.Text.Lazy.Encoding as TL
import Data.Text.Encoding.Error (lenientDecode)
import Data.Word (Word8)
class (Integral (Index seq), GrowingAppend seq) => SemiSequence seq where
type Index seq
intersperse :: Element seq -> seq -> seq
reverse :: seq -> seq
find :: (Element seq -> Bool) -> seq -> Maybe (Element seq)
sortBy :: (Element seq -> Element seq -> Ordering) -> seq -> seq
cons :: Element seq -> seq -> seq
snoc :: seq -> Element seq -> seq
singleton :: MonoPointed seq => Element seq -> seq
singleton :: forall seq. MonoPointed seq => Element seq -> seq
singleton = Element seq -> seq
forall seq. MonoPointed seq => Element seq -> seq
opoint
{-# INLINE singleton #-}
class (Monoid seq, MonoTraversable seq, SemiSequence seq, MonoPointed seq) => IsSequence seq where
fromList :: [Element seq] -> seq
fromList = [seq] -> seq
forall a. Monoid a => [a] -> a
mconcat ([seq] -> seq) -> ([Element seq] -> [seq]) -> [Element seq] -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> seq) -> [Element seq] -> [seq]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Element seq -> seq
forall seq. MonoPointed seq => Element seq -> seq
singleton
lengthIndex :: seq -> Index seq;
lengthIndex = Int64 -> Index seq
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> Index seq) -> (seq -> Int64) -> seq -> Index seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> Int64
forall mono. MonoFoldable mono => mono -> Int64
olength64;
break :: (Element seq -> Bool) -> seq -> (seq, seq)
break Element seq -> Bool
f = ([Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq)
-> ([Element seq] -> seq)
-> ([Element seq], [Element seq])
-> (seq, seq)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (([Element seq], [Element seq]) -> (seq, seq))
-> (seq -> ([Element seq], [Element seq])) -> seq -> (seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool)
-> [Element seq] -> ([Element seq], [Element seq])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.break Element seq -> Bool
f ([Element seq] -> ([Element seq], [Element seq]))
-> (seq -> [Element seq]) -> seq -> ([Element seq], [Element seq])
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
span :: (Element seq -> Bool) -> seq -> (seq, seq)
span Element seq -> Bool
f = ([Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq)
-> ([Element seq] -> seq)
-> ([Element seq], [Element seq])
-> (seq, seq)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (([Element seq], [Element seq]) -> (seq, seq))
-> (seq -> ([Element seq], [Element seq])) -> seq -> (seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool)
-> [Element seq] -> ([Element seq], [Element seq])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.span Element seq -> Bool
f ([Element seq] -> ([Element seq], [Element seq]))
-> (seq -> [Element seq]) -> seq -> ([Element seq], [Element seq])
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
dropWhile :: (Element seq -> Bool) -> seq -> seq
dropWhile Element seq -> Bool
f = [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq) -> (seq -> [Element seq]) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool) -> [Element seq] -> [Element seq]
forall a. (a -> Bool) -> [a] -> [a]
List.dropWhile Element seq -> Bool
f ([Element seq] -> [Element seq])
-> (seq -> [Element seq]) -> seq -> [Element seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
takeWhile :: (Element seq -> Bool) -> seq -> seq
takeWhile Element seq -> Bool
f = [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq) -> (seq -> [Element seq]) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool) -> [Element seq] -> [Element seq]
forall a. (a -> Bool) -> [a] -> [a]
List.takeWhile Element seq -> Bool
f ([Element seq] -> [Element seq])
-> (seq -> [Element seq]) -> seq -> [Element seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
splitAt :: Index seq -> seq -> (seq, seq)
splitAt Index seq
i = ([Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq)
-> ([Element seq] -> seq)
-> ([Element seq], [Element seq])
-> (seq, seq)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (([Element seq], [Element seq]) -> (seq, seq))
-> (seq -> ([Element seq], [Element seq])) -> seq -> (seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Index seq -> [Element seq] -> ([Element seq], [Element seq])
forall i a. Integral i => i -> [a] -> ([a], [a])
List.genericSplitAt Index seq
i ([Element seq] -> ([Element seq], [Element seq]))
-> (seq -> [Element seq]) -> seq -> ([Element seq], [Element seq])
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
unsafeSplitAt :: Index seq -> seq -> (seq, seq)
unsafeSplitAt Index seq
i seq
seq = (Index seq -> seq -> seq
forall seq. IsSequence seq => Index seq -> seq -> seq
unsafeTake Index seq
i seq
seq, Index seq -> seq -> seq
forall seq. IsSequence seq => Index seq -> seq -> seq
unsafeDrop Index seq
i seq
seq)
take :: Index seq -> seq -> seq
take Index seq
i = (seq, seq) -> seq
forall a b. (a, b) -> a
fst ((seq, seq) -> seq) -> (seq -> (seq, seq)) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Index seq -> seq -> (seq, seq)
forall seq. IsSequence seq => Index seq -> seq -> (seq, seq)
splitAt Index seq
i
unsafeTake :: Index seq -> seq -> seq
unsafeTake = Index seq -> seq -> seq
forall seq. IsSequence seq => Index seq -> seq -> seq
take
drop :: Index seq -> seq -> seq
drop Index seq
i = (seq, seq) -> seq
forall a b. (a, b) -> b
snd ((seq, seq) -> seq) -> (seq -> (seq, seq)) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Index seq -> seq -> (seq, seq)
forall seq. IsSequence seq => Index seq -> seq -> (seq, seq)
splitAt Index seq
i
unsafeDrop :: Index seq -> seq -> seq
unsafeDrop = Index seq -> seq -> seq
forall seq. IsSequence seq => Index seq -> seq -> seq
drop
dropEnd :: Index seq -> seq -> seq
dropEnd Index seq
i seq
s = (seq, seq) -> seq
forall a b. (a, b) -> a
fst ((seq, seq) -> seq) -> (seq, seq) -> seq
forall a b. (a -> b) -> a -> b
$ Index seq -> seq -> (seq, seq)
forall seq. IsSequence seq => Index seq -> seq -> (seq, seq)
splitAt (seq -> Index seq
forall seq. IsSequence seq => seq -> Index seq
lengthIndex seq
s Index seq -> Index seq -> Index seq
forall a. Num a => a -> a -> a
- Index seq
i) seq
s
partition :: (Element seq -> Bool) -> seq -> (seq, seq)
partition Element seq -> Bool
f = ([Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq)
-> ([Element seq] -> seq)
-> ([Element seq], [Element seq])
-> (seq, seq)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
*** [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (([Element seq], [Element seq]) -> (seq, seq))
-> (seq -> ([Element seq], [Element seq])) -> seq -> (seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool)
-> [Element seq] -> ([Element seq], [Element seq])
forall a. (a -> Bool) -> [a] -> ([a], [a])
List.partition Element seq -> Bool
f ([Element seq] -> ([Element seq], [Element seq]))
-> (seq -> [Element seq]) -> seq -> ([Element seq], [Element seq])
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
uncons :: seq -> Maybe (Element seq, seq)
uncons = ((Element seq, [Element seq]) -> (Element seq, seq))
-> Maybe (Element seq, [Element seq]) -> Maybe (Element seq, seq)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Element seq] -> seq)
-> (Element seq, [Element seq]) -> (Element seq, seq)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (Maybe (Element seq, [Element seq]) -> Maybe (Element seq, seq))
-> (seq -> Maybe (Element seq, [Element seq]))
-> seq
-> Maybe (Element seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Element seq] -> Maybe (Element seq, [Element seq])
forall seq. IsSequence seq => seq -> Maybe (Element seq, seq)
uncons ([Element seq] -> Maybe (Element seq, [Element seq]))
-> (seq -> [Element seq])
-> seq
-> Maybe (Element seq, [Element seq])
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
unsnoc :: seq -> Maybe (seq, Element seq)
unsnoc = (([Element seq], Element seq) -> (seq, Element seq))
-> Maybe ([Element seq], Element seq) -> Maybe (seq, Element seq)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Element seq] -> seq)
-> ([Element seq], Element seq) -> (seq, Element seq)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList) (Maybe ([Element seq], Element seq) -> Maybe (seq, Element seq))
-> (seq -> Maybe ([Element seq], Element seq))
-> seq
-> Maybe (seq, Element seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Element seq] -> Maybe ([Element seq], Element seq)
forall seq. IsSequence seq => seq -> Maybe (seq, Element seq)
unsnoc ([Element seq] -> Maybe ([Element seq], Element seq))
-> (seq -> [Element seq])
-> seq
-> Maybe ([Element seq], Element seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
filter :: (Element seq -> Bool) -> seq -> seq
filter Element seq -> Bool
f = [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq) -> (seq -> [Element seq]) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Bool) -> [Element seq] -> [Element seq]
forall a. (a -> Bool) -> [a] -> [a]
List.filter Element seq -> Bool
f ([Element seq] -> [Element seq])
-> (seq -> [Element seq]) -> seq -> [Element seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
filterM :: Monad m => (Element seq -> m Bool) -> seq -> m seq
filterM Element seq -> m Bool
f = ([Element seq] -> seq) -> m [Element seq] -> m seq
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList (m [Element seq] -> m seq)
-> (seq -> m [Element seq]) -> seq -> m seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element [Element seq] -> m Bool)
-> [Element seq] -> m [Element seq]
forall seq (m :: * -> *).
(IsSequence seq, Monad m) =>
(Element seq -> m Bool) -> seq -> m seq
filterM Element seq -> m Bool
Element [Element seq] -> m Bool
f ([Element seq] -> m [Element seq])
-> (seq -> [Element seq]) -> seq -> m [Element seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
replicate :: Index seq -> Element seq -> seq
replicate Index seq
i = [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([Element seq] -> seq)
-> (Element seq -> [Element seq]) -> Element seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Index seq -> Element seq -> [Element seq]
forall i a. Integral i => i -> a -> [a]
List.genericReplicate Index seq
i
replicateM :: Monad m => Index seq -> m (Element seq) -> m seq
replicateM Index seq
i = ([Element seq] -> seq) -> m [Element seq] -> m seq
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList (m [Element seq] -> m seq)
-> (m (Element seq) -> m [Element seq]) -> m (Element seq) -> m seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> m (Element seq) -> m [Element seq]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
Control.Monad.replicateM (Index seq -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Index seq
i)
groupBy :: (Element seq -> Element seq -> Bool) -> seq -> [seq]
groupBy Element seq -> Element seq -> Bool
f = ([Element seq] -> seq) -> [[Element seq]] -> [seq]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([[Element seq]] -> [seq])
-> (seq -> [[Element seq]]) -> seq -> [seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq -> Element seq -> Bool)
-> [Element seq] -> [[Element seq]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
List.groupBy Element seq -> Element seq -> Bool
f ([Element seq] -> [[Element seq]])
-> (seq -> [Element seq]) -> seq -> [[Element seq]]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
groupAllOn :: Eq b => (Element seq -> b) -> seq -> [seq]
groupAllOn Element seq -> b
f = ([Element seq] -> seq) -> [[Element seq]] -> [seq]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([[Element seq]] -> [seq])
-> (seq -> [[Element seq]]) -> seq -> [seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element [Element seq] -> b) -> [Element seq] -> [[Element seq]]
forall seq b.
(IsSequence seq, Eq b) =>
(Element seq -> b) -> seq -> [seq]
groupAllOn Element seq -> b
Element [Element seq] -> b
f ([Element seq] -> [[Element seq]])
-> (seq -> [Element seq]) -> seq -> [[Element seq]]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
subsequences :: seq -> [seq]
subsequences = ([Element seq] -> seq) -> [[Element seq]] -> [seq]
forall a b. (a -> b) -> [a] -> [b]
List.map [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([[Element seq]] -> [seq])
-> (seq -> [[Element seq]]) -> seq -> [seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Element seq] -> [[Element seq]]
forall a. [a] -> [[a]]
List.subsequences ([Element seq] -> [[Element seq]])
-> (seq -> [Element seq]) -> seq -> [[Element seq]]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
permutations :: seq -> [seq]
permutations = ([Element seq] -> seq) -> [[Element seq]] -> [seq]
forall a b. (a -> b) -> [a] -> [b]
List.map [Element seq] -> seq
forall seq. IsSequence seq => [Element seq] -> seq
fromList ([[Element seq]] -> [seq])
-> (seq -> [[Element seq]]) -> seq -> [seq]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. [Element seq] -> [[Element seq]]
forall a. [a] -> [[a]]
List.permutations ([Element seq] -> [[Element seq]])
-> (seq -> [Element seq]) -> seq -> [[Element seq]]
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> [Element seq]
forall mono. MonoFoldable mono => mono -> [Element mono]
otoList
tailEx :: seq -> seq
tailEx = (Element seq, seq) -> seq
forall a b. (a, b) -> b
snd ((Element seq, seq) -> seq)
-> (seq -> (Element seq, seq)) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (Element seq, seq)
-> ((Element seq, seq) -> (Element seq, seq))
-> Maybe (Element seq, seq)
-> (Element seq, seq)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> (Element seq, seq)
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.Sequences.tailEx") (Element seq, seq) -> (Element seq, seq)
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (Maybe (Element seq, seq) -> (Element seq, seq))
-> (seq -> Maybe (Element seq, seq)) -> seq -> (Element seq, seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> Maybe (Element seq, seq)
forall seq. IsSequence seq => seq -> Maybe (Element seq, seq)
uncons
tailMay :: seq -> Maybe seq
tailMay seq
seq
| seq -> Bool
forall mono. MonoFoldable mono => mono -> Bool
onull seq
seq = Maybe seq
forall a. Maybe a
Nothing
| Bool
otherwise = seq -> Maybe seq
forall a. a -> Maybe a
Just (seq -> seq
forall seq. IsSequence seq => seq -> seq
tailEx seq
seq)
{-# INLINE tailMay #-}
initEx :: seq -> seq
initEx = (seq, Element seq) -> seq
forall a b. (a, b) -> a
fst ((seq, Element seq) -> seq)
-> (seq -> (seq, Element seq)) -> seq -> seq
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (seq, Element seq)
-> ((seq, Element seq) -> (seq, Element seq))
-> Maybe (seq, Element seq)
-> (seq, Element seq)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> (seq, Element seq)
forall a. HasCallStack => [Char] -> a
error [Char]
"Data.Sequences.initEx") (seq, Element seq) -> (seq, Element seq)
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id (Maybe (seq, Element seq) -> (seq, Element seq))
-> (seq -> Maybe (seq, Element seq)) -> seq -> (seq, Element seq)
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. seq -> Maybe (seq, Element seq)
forall seq. IsSequence seq => seq -> Maybe (seq, Element seq)
unsnoc
initMay :: IsSequence seq => seq -> Maybe seq
initMay seq
seq
| seq -> Bool
forall mono. MonoFoldable mono => mono -> Bool
onull seq
seq = Maybe seq
forall a. Maybe a
Nothing
| Bool
otherwise = seq -> Maybe seq
forall a. a -> Maybe a
Just (seq -> seq
forall seq. IsSequence seq => seq -> seq
initEx seq
seq)
{-# INLINE initMay #-}
unsafeTail :: seq -> seq
unsafeTail = seq -> seq
forall seq. IsSequence seq => seq -> seq
tailEx