{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module Slist
(
Slist
, Size
, slist
, infiniteSlist
, one
, iterate
#if ( __GLASGOW_HASKELL__ > 802 )
, iterate'
#endif
, repeat
, replicate
, cycle
, fromRange
, len
, size
, isEmpty
, head
, safeHead
, last
, safeLast
, init
, tail
, append'
, cons
, cons'
, uncons
, map
, reverse
, safeReverse
, intersperse
, intercalate
, transpose
, subsequences
, permutations
, concat
, concat'
, concatMap
, concatMap'
, scanl
, scanl'
, scanl1
, scanr
, scanr1
, unfoldr
, take
, drop
, splitAt
, takeWhile
, dropWhile
, span
, break
, stripPrefix
, safeStripPrefix
, group
, groupBy
, inits
, tails
, chunksOf
, listChunksOf
, isPrefixOf
, safeIsPrefixOf
, isSuffixOf
, safeIsSuffixOf
, isInfixOf
, safeIsInfixOf
, isSubsequenceOf
, safeIsSubsequenceOf
, lookup
, filter
, partition
, partitionWith
, listPartitionWith
, at
, unsafeAt
, elemIndex
, elemIndices
, findIndex
, findIndices
, zip
, zip3
, zipWith
, zipWith3
, unzip
, unzip3
, nub
, nubBy
, ordNub
, delete
, deleteBy
, deleteFirstsBy
, diff
, union
, unionBy
, intersect
, intersectBy
, sort
, sortBy
, sortOn
, sortWith
, insert
, insertBy
, genericLength
, genericTake
, genericDrop
, genericSplitAt
, genericAt
, genericUnsafeAt
, genericReplicate
, maybeToSlist
, slistToMaybe
, catMaybes
, mapMaybe
, slistWith
, mapToVals
, mapToKeys
, mapToPairs
, setToSlist
) where
import Data.Bifunctor (bimap, first, second)
import Data.Either (partitionEithers)
import Data.Foldable (foldl')
#if ( __GLASGOW_HASKELL__ == 802 )
import Data.Semigroup (Semigroup (..))
#endif
import GHC.Exts (fromListN)
import Prelude hiding (break, concat, concatMap, cycle, drop, dropWhile, filter, head, init,
iterate, last, lookup, map, repeat, replicate, reverse, scanl, scanl1, scanr,
scanr1, span, splitAt, tail, take, takeWhile, unzip, unzip3, zip, zip3, zipWith,
zipWith3)
import Slist.Containers (mapToKeys, mapToPairs, mapToVals, setToSlist)
import Slist.Maybe (catMaybes, mapMaybe, maybeToSlist, slistToMaybe, slistWith)
import Slist.Size (Size (..), sizes)
import Slist.Type (Slist (..), cons, infiniteSlist, isEmpty, len, map, one, size, slist)
import qualified Data.List as L
import qualified Data.Set as Set
import qualified GHC.Exts as Exts
import qualified Prelude as P
iterate :: (a -> a) -> a -> Slist a
iterate :: forall a. (a -> a) -> a -> Slist a
iterate a -> a
f = forall a. [a] -> Slist a
infiniteSlist forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a) -> a -> [a]
L.iterate a -> a
f
{-# INLINE iterate #-}
#if ( __GLASGOW_HASKELL__ > 802 )
iterate' :: (a -> a) -> a -> Slist a
iterate' :: forall a. (a -> a) -> a -> Slist a
iterate' a -> a
f = forall a. [a] -> Slist a
infiniteSlist forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a) -> a -> [a]
L.iterate' a -> a
f
{-# INLINE iterate' #-}
#endif
repeat :: a -> Slist a
repeat :: forall a. a -> Slist a
repeat = forall a. [a] -> Slist a
infiniteSlist forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> [a]
L.repeat
{-# INLINE repeat #-}
replicate :: Int -> a -> Slist a
replicate :: forall a. Int -> a -> Slist a
replicate Int
n a
x
| Int
n forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Monoid a => a
mempty
| Bool
otherwise = forall a. [a] -> Size -> Slist a
Slist (forall a. Int -> a -> [a]
L.replicate Int
n a
x) forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
n
{-# INLINE replicate #-}
cycle :: Slist a -> Slist a
cycle :: forall a. Slist a -> Slist a
cycle sl :: Slist a
sl@(Slist [a]
_ Size
Infinity) = Slist a
sl
cycle Slist{[a]
Size
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
sSize :: Size
sList :: [a]
..} = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
L.cycle [a]
sList
{-# INLINE cycle #-}
fromRange :: Enum a => a -> a -> Slist a
fromRange :: forall a. Enum a => a -> a -> Slist a
fromRange a
from a
to = forall a. [a] -> Size -> Slist a
Slist [a
from..a
to] Size
s
where
s :: Size
s :: Size
s = Int -> Size
Size forall a b. (a -> b) -> a -> b
$ forall a. Ord a => a -> a -> a
max Int
0 (forall a. Enum a => a -> Int
fromEnum a
to forall a. Num a => a -> a -> a
- forall a. Enum a => a -> Int
fromEnum a
from forall a. Num a => a -> a -> a
+ Int
1)
{-# INLINE fromRange #-}
head :: Slist a -> a
head :: forall a. Slist a -> a
head = forall a. [a] -> a
P.head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Slist a -> [a]
sList
{-# INLINE head #-}
safeHead :: Slist a -> Maybe a
safeHead :: forall a. Slist a -> Maybe a
safeHead Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = case Size
sSize of
Size Int
0 -> forall a. Maybe a
Nothing
Size
_ -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
P.head [a]
sList
{-# INLINE safeHead #-}
last :: Slist a -> a
last :: forall a. Slist a -> a
last = forall a. [a] -> a
P.last forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Slist a -> [a]
sList
{-# INLINE last #-}
safeLast :: Slist a -> Maybe a
safeLast :: forall a. Slist a -> Maybe a
safeLast Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = case Size
sSize of
Size
Infinity -> forall a. Maybe a
Nothing
Size Int
0 -> forall a. Maybe a
Nothing
Size
_ -> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
P.last [a]
sList
{-# INLINE safeLast #-}
tail :: Slist a -> Slist a
tail :: forall a. Slist a -> Slist a
tail Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = case Size
sSize of
Size Int
0 -> forall a. Monoid a => a
mempty
Size
_ -> forall a. [a] -> Size -> Slist a
Slist (forall a. Int -> [a] -> [a]
P.drop Int
1 [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
- Size
1)
{-# INLINE tail #-}
init :: Slist a -> Slist a
init :: forall a. Slist a -> Slist a
init sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = case Size
sSize of
Size
Infinity -> Slist a
sl
Size Int
0 -> forall a. Monoid a => a
mempty
Size
_ -> forall a. [a] -> Size -> Slist a
Slist (forall a. [a] -> [a]
P.init [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
- Size
1)
{-# INLINE init #-}
append' :: Slist a -> Slist a -> Slist a
append' :: forall a. Slist a -> Slist a -> Slist a
append' Slist a
sl1 Slist a
sl2
| forall a. Slist a -> Size
sSize Slist a
sl1 forall a. Eq a => a -> a -> Bool
== Size
0 = Slist a
sl2
| forall a. Slist a -> Size
sSize Slist a
sl2 forall a. Eq a => a -> a -> Bool
== Size
0 = Slist a
sl1
| Bool
otherwise = let !newSize :: Size
newSize = forall a. Slist a -> Size
sSize Slist a
sl1 forall a. Num a => a -> a -> a
+ forall a. Slist a -> Size
sSize Slist a
sl2 in Slist
{ sList :: [a]
sList = forall a. Slist a -> [a]
sList Slist a
sl1 forall a. Semigroup a => a -> a -> a
<> forall a. Slist a -> [a]
sList Slist a
sl2
, sSize :: Size
sSize = Size
newSize
}
cons' :: a -> Slist a -> Slist a
cons' :: forall a. a -> Slist a -> Slist a
cons' a
x (Slist [a]
xs !Size
s) = let !newSize :: Size
newSize = Size
s forall a. Num a => a -> a -> a
+ Size
1 in forall a. [a] -> Size -> Slist a
Slist (a
xforall a. a -> [a] -> [a]
:[a]
xs) Size
newSize
{-# INLINE cons' #-}
uncons :: Slist a -> Maybe (a, Slist a)
uncons :: forall a. Slist a -> Maybe (a, Slist a)
uncons (Slist [] Size
_) = forall a. Maybe a
Nothing
uncons (Slist (a
x:[a]
xs) Size
s) = forall a. a -> Maybe a
Just (a
x, forall a. [a] -> Size -> Slist a
Slist [a]
xs forall a b. (a -> b) -> a -> b
$ Size
s forall a. Num a => a -> a -> a
- Size
1)
{-# INLINE uncons #-}
reverse :: Slist a -> Slist a
reverse :: forall a. Slist a -> Slist a
reverse Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. [a] -> [a]
L.reverse [a]
sList) Size
sSize
{-# INLINE reverse #-}
safeReverse :: Slist a -> Slist a
safeReverse :: forall a. Slist a -> Slist a
safeReverse sl :: Slist a
sl@(Slist [a]
_ Size
Infinity) = Slist a
sl
safeReverse Slist a
sl = forall a. Slist a -> Slist a
reverse Slist a
sl
{-# INLINE safeReverse #-}
intersperse :: a -> Slist a -> Slist a
intersperse :: forall a. a -> Slist a -> Slist a
intersperse a
_ sl :: Slist a
sl@(Slist [a]
_ (Size Int
0)) = Slist a
sl
intersperse a
a Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. a -> [a] -> [a]
L.intersperse a
a [a]
sList) (Size
2 forall a. Num a => a -> a -> a
* Size
sSize forall a. Num a => a -> a -> a
- Size
1)
{-# INLINE intersperse #-}
intercalate :: Slist a -> Slist (Slist a) -> Slist a
intercalate :: forall a. Slist a -> Slist (Slist a) -> Slist a
intercalate Slist a
x = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Semigroup a => a -> a -> a
(<>) forall a. Monoid a => a
mempty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Slist a -> Slist a
intersperse Slist a
x
{-# INLINE intercalate #-}
transpose :: Slist (Slist a) -> Slist (Slist a)
transpose :: forall a. Slist (Slist a) -> Slist (Slist a)
transpose (Slist [Slist a]
l Size
_) = Slist
{ sList :: [Slist a]
sList = forall a b. (a -> b) -> [a] -> [b]
P.map forall a. [a] -> Slist a
slist forall a b. (a -> b) -> a -> b
$ forall a. [[a]] -> [[a]]
L.transpose forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
P.map forall a. Slist a -> [a]
sList [Slist a]
l
, sSize :: Size
sSize = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
P.map forall a. Slist a -> Size
sSize [Slist a]
l
}
{-# INLINE transpose #-}
subsequences :: Slist a -> Slist (Slist a)
subsequences :: forall a. Slist a -> Slist (Slist a)
subsequences Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = Slist
{ sList :: [Slist a]
sList = forall a b. (a -> b) -> [a] -> [b]
P.map forall a. [a] -> Slist a
slist forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [[a]]
L.subsequences [a]
sList
, sSize :: Size
sSize = Size -> Size
newSize Size
sSize
}
where
newSize :: Size -> Size
newSize :: Size -> Size
newSize Size
Infinity = Size
Infinity
newSize (Size Int
n) = Int -> Size
Size forall a b. (a -> b) -> a -> b
$ Int
2 forall a b. (Num a, Integral b) => a -> b -> a
^ forall a. Integral a => a -> Integer
toInteger Int
n
{-# INLINE subsequences #-}
permutations :: Slist a -> Slist (Slist a)
permutations :: forall a. Slist a -> Slist (Slist a)
permutations (Slist [a]
l Size
s) = Slist
{ sList :: [Slist a]
sList = forall a b. (a -> b) -> [a] -> [b]
P.map (forall a. [a] -> Size -> Slist a
`Slist` Size
s) forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [[a]]
L.permutations [a]
l
, sSize :: Size
sSize = Size -> Size
fact Size
s
}
where
fact :: Size -> Size
fact :: Size -> Size
fact Size
Infinity = Size
Infinity
fact (Size Int
n) = Int -> Size
Size forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
go Int
1 Int
n
go :: Int -> Int -> Int
go :: Int -> Int -> Int
go !Int
acc Int
0 = Int
acc
go !Int
acc Int
n = Int -> Int -> Int
go (Int
acc forall a. Num a => a -> a -> a
* Int
n) (Int
n forall a. Num a => a -> a -> a
- Int
1)
{-# INLINE permutations #-}
concat :: Foldable t => t (Slist a) -> Slist a
concat :: forall (t :: * -> *) a. Foldable t => t (Slist a) -> Slist a
concat = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Semigroup a => a -> a -> a
(<>) forall a. Monoid a => a
mempty
{-# INLINE concat #-}
concat' :: Foldable t => t (Slist a) -> Slist a
concat' :: forall (t :: * -> *) a. Foldable t => t (Slist a) -> Slist a
concat' = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall a. Slist a -> Slist a -> Slist a
append' forall a. Monoid a => a
mempty
{-# INLINE concat' #-}
concatMap :: Foldable t => (a -> Slist b) -> t a -> Slist b
concatMap :: forall (t :: * -> *) a b.
Foldable t =>
(a -> Slist b) -> t a -> Slist b
concatMap = forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap
{-# INLINE concatMap #-}
concatMap' :: Foldable t => (a -> Slist b) -> t a -> Slist b
concatMap' :: forall (t :: * -> *) a b.
Foldable t =>
(a -> Slist b) -> t a -> Slist b
concatMap' a -> Slist b
f = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Slist b
acc a
x -> Slist b
acc forall a. Slist a -> Slist a -> Slist a
`append'` a -> Slist b
f a
x) forall a. Monoid a => a
mempty
{-# INLINE concatMap' #-}
scanl :: (b -> a -> b) -> b -> Slist a -> Slist b
scanl :: forall b a. (b -> a -> b) -> b -> Slist a -> Slist b
scanl b -> a -> b
f b
b Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall b a. (b -> a -> b) -> b -> [a] -> [b]
L.scanl b -> a -> b
f b
b [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
+ Size
1)
{-# INLINE scanl #-}
scanl' :: (b -> a -> b) -> b -> Slist a -> Slist b
scanl' :: forall b a. (b -> a -> b) -> b -> Slist a -> Slist b
scanl' b -> a -> b
f b
b Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall b a. (b -> a -> b) -> b -> [a] -> [b]
L.scanl' b -> a -> b
f b
b [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
+ Size
1)
{-# INLINE scanl' #-}
scanl1 :: (a -> a -> a) -> Slist a -> Slist a
scanl1 :: forall a. (a -> a -> a) -> Slist a -> Slist a
scanl1 a -> a -> a
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. (a -> a -> a) -> [a] -> [a]
L.scanl1 a -> a -> a
f [a]
sList) Size
sSize
{-# INLINE scanl1 #-}
scanr :: (a -> b -> b) -> b -> Slist a -> Slist b
scanr :: forall a b. (a -> b -> b) -> b -> Slist a -> Slist b
scanr a -> b -> b
f b
b Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a b. (a -> b -> b) -> b -> [a] -> [b]
L.scanr a -> b -> b
f b
b [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
+ Size
1)
{-# INLINE scanr #-}
scanr1 :: (a -> a -> a) -> Slist a -> Slist a
scanr1 :: forall a. (a -> a -> a) -> Slist a -> Slist a
scanr1 a -> a -> a
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. (a -> a -> a) -> [a] -> [a]
L.scanr1 a -> a -> a
f [a]
sList) Size
sSize
{-# INLINE scanr1 #-}
unfoldr :: forall a b . (b -> Maybe (a, b)) -> b -> Slist a
unfoldr :: forall a b. (b -> Maybe (a, b)) -> b -> Slist a
unfoldr b -> Maybe (a, b)
f b
def = let (Int
s, [a]
l) = b -> (Int, [a])
go b
def in forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s
where
go :: b -> (Int, [a])
go :: b -> (Int, [a])
go b
b = case b -> Maybe (a, b)
f b
b of
Just (a
a, b
newB) -> forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap (forall a. Num a => a -> a -> a
+ Int
1) (a
aforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ b -> (Int, [a])
go b
newB
Maybe (a, b)
Nothing -> (Int
0, [])
{-# INLINE unfoldr #-}
take :: Int -> Slist a -> Slist a
take :: forall a. Int -> Slist a -> Slist a
take Int
i sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = Slist a
sl
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Monoid a => a
mempty
| Bool
otherwise = Slist
{ sList :: [a]
sList = forall a. Int -> [a] -> [a]
P.take Int
i [a]
sList
, sSize :: Size
sSize = Int -> Size
Size Int
i
}
{-# INLINE take #-}
drop :: Int -> Slist a -> Slist a
drop :: forall a. Int -> Slist a -> Slist a
drop Int
i sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = Slist a
sl
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = forall a. Monoid a => a
mempty
| Bool
otherwise = Slist
{ sList :: [a]
sList = forall a. Int -> [a] -> [a]
P.drop Int
i [a]
sList
, sSize :: Size
sSize = Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
i
}
{-# INLINE drop #-}
splitAt :: Int -> Slist a -> (Slist a, Slist a)
splitAt :: forall a. Int -> Slist a -> (Slist a, Slist a)
splitAt Int
i sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = (forall a. Monoid a => a
mempty, Slist a
sl)
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = (Slist a
sl, forall a. Monoid a => a
mempty)
| Bool
otherwise =
let ([a]
l1, [a]
l2) = forall a. Int -> [a] -> ([a], [a])
P.splitAt Int
i [a]
sList
s2 :: Size
s2 = Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
i
in (forall a. [a] -> Size -> Slist a
Slist [a]
l1 forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
i, forall a. [a] -> Size -> Slist a
Slist [a]
l2 Size
s2)
{-# INLINE splitAt #-}
takeWhile :: forall a . (a -> Bool) -> Slist a -> Slist a
takeWhile :: forall a. (a -> Bool) -> Slist a -> Slist a
takeWhile a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s, [a]
l) = Int -> [a] -> (Int, [a])
go Int
0 [a]
sList in
forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s
where
go :: Int -> [a] -> (Int, [a])
go :: Int -> [a] -> (Int, [a])
go !Int
n [] = (Int
n, [])
go !Int
n (a
x:[a]
xs) =
if a -> Bool
p a
x
then let (Int
i, [a]
l) = Int -> [a] -> (Int, [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs in (Int
i, a
xforall a. a -> [a] -> [a]
:[a]
l)
else (Int
n, [])
{-# INLINE takeWhile #-}
dropWhile :: forall a . (a -> Bool) -> Slist a -> Slist a
dropWhile :: forall a. (a -> Bool) -> Slist a -> Slist a
dropWhile a -> Bool
p (Slist [a]
l Size
Infinity) = forall a. [a] -> Size -> Slist a
Slist (forall a. (a -> Bool) -> [a] -> [a]
P.dropWhile a -> Bool
p [a]
l) Size
Infinity
dropWhile a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s, [a]
l) = Int -> [a] -> (Int, [a])
go Int
0 [a]
sList in
forall a. [a] -> Size -> Slist a
Slist [a]
l (Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
s)
where
go :: Int -> [a] -> (Int, [a])
go :: Int -> [a] -> (Int, [a])
go !Int
n [] = (Int
n, [])
go !Int
n (a
x:[a]
xs) =
if a -> Bool
p a
x
then Int -> [a] -> (Int, [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
else (Int
n, a
xforall a. a -> [a] -> [a]
:[a]
xs)
{-# INLINE dropWhile #-}
span :: forall a . (a -> Bool) -> Slist a -> (Slist a, Slist a)
span :: forall a. (a -> Bool) -> Slist a -> (Slist a, Slist a)
span a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s, [a]
l, [a]
r) = Int -> [a] -> (Int, [a], [a])
go Int
0 [a]
sList in
( forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s
, forall a. [a] -> Size -> Slist a
Slist [a]
r (Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
s)
)
where
go :: Int -> [a] -> (Int, [a], [a])
go :: Int -> [a] -> (Int, [a], [a])
go !Int
n [] = (Int
n, [], [])
go !Int
n (a
x:[a]
xs) =
if a -> Bool
p a
x
then let (Int
s, [a]
l, [a]
r) = Int -> [a] -> (Int, [a], [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs in (Int
s, a
xforall a. a -> [a] -> [a]
:[a]
l, [a]
r)
else (Int
n, [], a
xforall a. a -> [a] -> [a]
:[a]
xs)
{-# INLINE span #-}
break :: (a -> Bool) -> Slist a -> (Slist a, Slist a)
break :: forall a. (a -> Bool) -> Slist a -> (Slist a, Slist a)
break a -> Bool
p = forall a. (a -> Bool) -> Slist a -> (Slist a, Slist a)
span (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# INLINE break #-}
chunksOf :: Int -> Slist a -> Slist (Slist a)
chunksOf :: forall a. Int -> Slist a -> Slist (Slist a)
chunksOf Int
i sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Monoid a => a
mempty
| Size
sSize forall a. Eq a => a -> a -> Bool
== Size
Infinity = forall a. [a] -> Size -> Slist a
Slist (forall a b. (a -> b) -> [a] -> [b]
P.map (forall l. IsList l => Int -> [Item l] -> l
fromListN Int
i) forall a b. (a -> b) -> a -> b
$ forall a. Int -> [a] -> [[a]]
listChunksOf Int
i [a]
sList) Size
Infinity
| Bool
otherwise = forall a. Slist a -> Slist (Slist a)
go Slist a
sl
where
go :: Slist a -> Slist (Slist a)
go :: forall a. Slist a -> Slist (Slist a)
go x :: Slist a
x@(Slist [a]
_ Size
s)
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
s = forall a. a -> Slist a
one Slist a
x
| Bool
otherwise =
let (Slist a
chunk, Slist a
rest) = forall a. Int -> Slist a -> (Slist a, Slist a)
splitAt Int
i Slist a
x
in forall a. a -> Slist a -> Slist a
cons Slist a
chunk forall a b. (a -> b) -> a -> b
$ forall a. Slist a -> Slist (Slist a)
go Slist a
rest
{-# INLINE chunksOf #-}
listChunksOf :: Int -> [a] -> [[a]]
listChunksOf :: forall a. Int -> [a] -> [[a]]
listChunksOf Int
i [a]
l
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Monoid a => a
mempty
| Bool
otherwise = forall a. [a] -> [[a]]
go [a]
l
where
go :: [a] -> [[a]]
go :: forall a. [a] -> [[a]]
go [] = []
go [a]
x =
let ([a]
chunk, [a]
rest) = forall a. Int -> [a] -> ([a], [a])
P.splitAt Int
i [a]
x
in [a]
chunk forall a. a -> [a] -> [a]
: forall a. [a] -> [[a]]
go [a]
rest
{-# INLINE listChunksOf #-}
stripPrefix :: Eq a => Slist a -> Slist a -> Maybe (Slist a)
stripPrefix :: forall a. Eq a => Slist a -> Slist a -> Maybe (Slist a)
stripPrefix (Slist [a]
l1 Size
s1) f :: Slist a
f@(Slist [a]
l2 Size
s2)
| Size
s1 forall a. Eq a => a -> a -> Bool
== Int -> Size
Size Int
0 = forall a. a -> Maybe a
Just Slist a
f
| Size
s1 forall a. Ord a => a -> a -> Bool
> Size
s2 = forall a. Maybe a
Nothing
| Bool
otherwise = (\[a]
l -> forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Size
s2 forall a. Num a => a -> a -> a
- Size
s1) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Eq a => [a] -> [a] -> Maybe [a]
L.stripPrefix [a]
l1 [a]
l2
{-# INLINE stripPrefix #-}
safeStripPrefix :: Eq a => Slist a -> Slist a -> Maybe (Slist a)
safeStripPrefix :: forall a. Eq a => Slist a -> Slist a -> Maybe (Slist a)
safeStripPrefix (Slist [a]
_ Size
Infinity) (Slist [a]
_ Size
Infinity) = forall a. Maybe a
Nothing
safeStripPrefix Slist a
sl1 Slist a
sl2 = forall a. Eq a => Slist a -> Slist a -> Maybe (Slist a)
stripPrefix Slist a
sl1 Slist a
sl2
{-# INLINE safeStripPrefix #-}
group :: Eq a => Slist a -> Slist (Slist a)
group :: forall a. Eq a => Slist a -> Slist (Slist a)
group = forall a. (a -> a -> Bool) -> Slist a -> Slist (Slist a)
groupBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE group #-}
groupBy :: (a -> a -> Bool) -> Slist a -> Slist (Slist a)
groupBy :: forall a. (a -> a -> Bool) -> Slist a -> Slist (Slist a)
groupBy a -> a -> Bool
p (Slist [a]
l Size
Infinity) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
P.map forall a. [a] -> Slist a
slist forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Bool) -> [a] -> [[a]]
L.groupBy a -> a -> Bool
p [a]
l
groupBy a -> a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Slist a
slist forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
P.map forall a. [a] -> Slist a
slist forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Bool) -> [a] -> [[a]]
L.groupBy a -> a -> Bool
p [a]
sList
{-# INLINE groupBy #-}
inits :: Slist a -> Slist (Slist a)
inits :: forall a. Slist a -> Slist (Slist a)
inits (Slist [a]
l Size
s) = Slist
{ sList :: [Slist a]
sList = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
L.zipWith forall a. [a] -> Size -> Slist a
Slist (forall a. [a] -> [[a]]
L.inits [a]
l) forall a b. (a -> b) -> a -> b
$ Size -> [Size]
sizes Size
s
, sSize :: Size
sSize = Size
s forall a. Num a => a -> a -> a
+ Size
1
}
{-# INLINE inits #-}
tails :: Slist a -> Slist (Slist a)
tails :: forall a. Slist a -> Slist (Slist a)
tails (Slist [a]
l Size
Infinity) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
P.map forall a. [a] -> Slist a
infiniteSlist (forall a. [a] -> [[a]]
L.tails [a]
l)
tails (Slist [a]
l s :: Size
s@(Size Int
n)) = Slist
{ sList :: [Slist a]
sList = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
L.zipWith (\[a]
li Int
i -> forall a. [a] -> Size -> Slist a
Slist [a]
li forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
i) (forall a. [a] -> [[a]]
L.tails [a]
l) [Int
n, Int
n forall a. Num a => a -> a -> a
- Int
1 .. Int
0]
, sSize :: Size
sSize = Size
s forall a. Num a => a -> a -> a
+ Size
1
}
{-# INLINE tails #-}
isPrefixOf :: Eq a => Slist a -> Slist a -> Bool
isPrefixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
isPrefixOf (Slist [a]
l1 Size
s1) (Slist [a]
l2 Size
s2)
| Size
s1 forall a. Ord a => a -> a -> Bool
> Size
s2 = Bool
False
| Bool
otherwise = [a]
l1 forall a. Eq a => [a] -> [a] -> Bool
`L.isPrefixOf` [a]
l2
{-# INLINE isPrefixOf #-}
safeIsPrefixOf :: Eq a => Slist a -> Slist a -> Bool
safeIsPrefixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
safeIsPrefixOf sl1 :: Slist a
sl1@(Slist [a]
_ Size
s1) sl2 :: Slist a
sl2@(Slist [a]
_ Size
s2)
| Size
s1 forall a. Eq a => a -> a -> Bool
== Size
Infinity Bool -> Bool -> Bool
&& Size
s2 forall a. Eq a => a -> a -> Bool
== Size
Infinity = Bool
False
| Bool
otherwise = Slist a
sl1 forall a. Eq a => Slist a -> Slist a -> Bool
`isPrefixOf` Slist a
sl2
{-# INLINE safeIsPrefixOf #-}
isSuffixOf :: Eq a => Slist a -> Slist a -> Bool
isSuffixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
isSuffixOf (Slist [a]
l1 Size
s1) (Slist [a]
l2 Size
s2)
| Size
s1 forall a. Ord a => a -> a -> Bool
> Size
s2 = Bool
False
| Bool
otherwise = [a]
l1 forall a. Eq a => [a] -> [a] -> Bool
`L.isSuffixOf` [a]
l2
{-# INLINE isSuffixOf #-}
safeIsSuffixOf :: Eq a => Slist a -> Slist a -> Bool
safeIsSuffixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
safeIsSuffixOf Slist a
sl1 sl2 :: Slist a
sl2@(Slist [a]
_ Size
s2)
| Size
s2 forall a. Eq a => a -> a -> Bool
== Size
Infinity = Bool
False
| Bool
otherwise = Slist a
sl1 forall a. Eq a => Slist a -> Slist a -> Bool
`isSuffixOf` Slist a
sl2
{-# INLINE safeIsSuffixOf #-}
isInfixOf :: Eq a => Slist a -> Slist a -> Bool
isInfixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
isInfixOf (Slist [a]
l1 Size
s1) (Slist [a]
l2 Size
s2)
| Size
s1 forall a. Ord a => a -> a -> Bool
> Size
s2 = Bool
False
| Bool
otherwise = [a]
l1 forall a. Eq a => [a] -> [a] -> Bool
`L.isInfixOf` [a]
l2
{-# INLINE isInfixOf #-}
safeIsInfixOf :: Eq a => Slist a -> Slist a -> Bool
safeIsInfixOf :: forall a. Eq a => Slist a -> Slist a -> Bool
safeIsInfixOf sl1 :: Slist a
sl1@(Slist [a]
_ Size
s1) sl2 :: Slist a
sl2@(Slist [a]
_ Size
s2)
| Size
s1 forall a. Eq a => a -> a -> Bool
== Size
Infinity Bool -> Bool -> Bool
&& Size
s2 forall a. Eq a => a -> a -> Bool
== Size
Infinity = Bool
False
| Bool
otherwise = Slist a
sl1 forall a. Eq a => Slist a -> Slist a -> Bool
`isInfixOf` Slist a
sl2
{-# INLINE safeIsInfixOf #-}
isSubsequenceOf :: Eq a => Slist a -> Slist a -> Bool
isSubsequenceOf :: forall a. Eq a => Slist a -> Slist a -> Bool
isSubsequenceOf (Slist [a]
l1 Size
s1) (Slist [a]
l2 Size
s2)
| Size
s1 forall a. Ord a => a -> a -> Bool
> Size
s2 = Bool
False
| Bool
otherwise = forall a. Eq a => [a] -> [a] -> Bool
L.isSubsequenceOf [a]
l1 [a]
l2
{-# INLINE isSubsequenceOf #-}
safeIsSubsequenceOf :: Eq a => Slist a -> Slist a -> Bool
safeIsSubsequenceOf :: forall a. Eq a => Slist a -> Slist a -> Bool
safeIsSubsequenceOf sl1 :: Slist a
sl1@(Slist [a]
_ Size
s1) sl2 :: Slist a
sl2@(Slist [a]
_ Size
s2)
| Size
s1 forall a. Eq a => a -> a -> Bool
== Size
Infinity Bool -> Bool -> Bool
&& Size
s2 forall a. Eq a => a -> a -> Bool
== Size
Infinity = Bool
False
| Bool
otherwise = forall a. Eq a => Slist a -> Slist a -> Bool
isSubsequenceOf Slist a
sl1 Slist a
sl2
{-# INLINE safeIsSubsequenceOf #-}
lookup :: Eq a => a -> Slist (a, b) -> Maybe b
lookup :: forall a b. Eq a => a -> Slist (a, b) -> Maybe b
lookup a
a = forall a b. Eq a => a -> [(a, b)] -> Maybe b
L.lookup a
a forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Slist a -> [a]
sList
{-# INLINE lookup #-}
filter :: forall a . (a -> Bool) -> Slist a -> Slist a
filter :: forall a. (a -> Bool) -> Slist a -> Slist a
filter a -> Bool
p (Slist [a]
l Size
Infinity) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
L.filter a -> Bool
p [a]
l
filter a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
newS, [a]
newL) = Int -> [a] -> (Int, [a])
go Int
0 [a]
sList in
forall a. [a] -> Size -> Slist a
Slist [a]
newL (Int -> Size
Size Int
newS)
where
go :: Int -> [a] -> (Int, [a])
go :: Int -> [a] -> (Int, [a])
go !Int
n [] = (Int
n, [])
go Int
n (a
x:[a]
xs) =
if a -> Bool
p a
x
then forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
else Int -> [a] -> (Int, [a])
go Int
n [a]
xs
{-# INLINE filter #-}
partition :: forall a . (a -> Bool) -> Slist a -> (Slist a, Slist a)
partition :: forall a. (a -> Bool) -> Slist a -> (Slist a, Slist a)
partition a -> Bool
p (Slist [a]
l Size
Infinity) = forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. [a] -> Slist a
infiniteSlist forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> ([a], [a])
L.partition a -> Bool
p [a]
l
partition a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s1, [a]
l1, [a]
l2) = Int -> [a] -> (Int, [a], [a])
go Int
0 [a]
sList in
(forall a. [a] -> Size -> Slist a
Slist [a]
l1 forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s1, forall a. [a] -> Size -> Slist a
Slist [a]
l2 forall a b. (a -> b) -> a -> b
$ Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
s1)
where
go :: Int -> [a] -> (Int, [a], [a])
go :: Int -> [a] -> (Int, [a], [a])
go !Int
n [] = (Int
n, [], [])
go Int
n (a
x:[a]
xs) =
if a -> Bool
p a
x
then forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [a], [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
else forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [a], [a])
go Int
n [a]
xs
{-# INLINE partition #-}
partitionWith :: forall a b c . (a -> Either b c) -> Slist a -> (Slist b, Slist c)
partitionWith :: forall a b c. (a -> Either b c) -> Slist a -> (Slist b, Slist c)
partitionWith a -> Either b c
f (Slist [a]
l Size
Infinity) = forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. [a] -> Slist a
infiniteSlist forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
listPartitionWith a -> Either b c
f [a]
l
partitionWith a -> Either b c
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s1, [b]
l1, [c]
l2) = Int -> [a] -> (Int, [b], [c])
go Int
0 [a]
sList in
(forall a. [a] -> Size -> Slist a
Slist [b]
l1 forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s1, forall a. [a] -> Size -> Slist a
Slist [c]
l2 forall a b. (a -> b) -> a -> b
$ Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
s1)
where
go :: Int -> [a] -> (Int, [b], [c])
go :: Int -> [a] -> (Int, [b], [c])
go !Int
n [] = (Int
n, [], [])
go Int
n (a
x:[a]
xs) = case a -> Either b c
f a
x of
Left b
b -> forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first (b
bforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [b], [c])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
Right c
c -> forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (c
cforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [b], [c])
go Int
n [a]
xs
{-# INLINE partitionWith #-}
listPartitionWith :: forall a b c . (a -> Either b c) -> [a] -> ([b], [c])
listPartitionWith :: forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
listPartitionWith a -> Either b c
f = forall a b. [Either a b] -> ([a], [b])
partitionEithers forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
L.map a -> Either b c
f
{-# INLINE listPartitionWith #-}
at :: Int -> Slist a -> Maybe a
at :: forall a. Int -> Slist a -> Maybe a
at Int
n Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
n forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int -> Size
Size Int
n forall a. Ord a => a -> a -> Bool
>= Size
sSize = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ [a]
sList forall a. [a] -> Int -> a
L.!! Int
n
{-# INLINE at #-}
unsafeAt :: Int -> Slist a -> a
unsafeAt :: forall a. Int -> Slist a -> a
unsafeAt Int
n Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = [a]
sList forall a. [a] -> Int -> a
L.!! Int
n
{-# INLINE unsafeAt #-}
elemIndex :: Eq a => a -> Slist a -> Maybe Int
elemIndex :: forall a. Eq a => a -> Slist a -> Maybe Int
elemIndex a
a = forall a. Eq a => a -> [a] -> Maybe Int
L.elemIndex a
a forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Slist a -> [a]
sList
{-# INLINE elemIndex #-}
elemIndices :: Eq a => a -> Slist a -> Slist Int
elemIndices :: forall a. Eq a => a -> Slist a -> Slist Int
elemIndices a
a = forall a. (a -> Bool) -> Slist a -> Slist Int
findIndices (a
a forall a. Eq a => a -> a -> Bool
==)
{-# INLINE elemIndices #-}
findIndex :: (a -> Bool) -> Slist a -> Maybe Int
findIndex :: forall a. (a -> Bool) -> Slist a -> Maybe Int
findIndex a -> Bool
p = forall a. (a -> Bool) -> [a] -> Maybe Int
L.findIndex a -> Bool
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Slist a -> [a]
sList
{-# INLINE findIndex #-}
findIndices :: forall a . (a -> Bool) -> Slist a -> Slist Int
findIndices :: forall a. (a -> Bool) -> Slist a -> Slist Int
findIndices a -> Bool
p (Slist [a]
l Size
Infinity) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [Int]
L.findIndices a -> Bool
p [a]
l
findIndices a -> Bool
p Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
newS, [Int]
newL) = Int -> Int -> [a] -> (Int, [Int])
go Int
0 Int
0 [a]
sList in
forall a. [a] -> Size -> Slist a
Slist [Int]
newL (Int -> Size
Size Int
newS)
where
go :: Int -> Int -> [a] -> (Int, [Int])
go :: Int -> Int -> [a] -> (Int, [Int])
go !Int
n Int
_ [] = (Int
n, [])
go Int
n !Int
cur (a
x:[a]
xs) =
if a -> Bool
p a
x
then forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (Int
curforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> Int -> [a] -> (Int, [Int])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) (Int
cur forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
else Int -> Int -> [a] -> (Int, [Int])
go Int
n (Int
cur forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
{-# INLINE findIndices #-}
zip :: Slist a -> Slist b -> Slist (a, b)
zip :: forall a b. Slist a -> Slist b -> Slist (a, b)
zip (Slist [a]
l1 Size
s1) (Slist [b]
l2 Size
s2) = Slist
{ sList :: [(a, b)]
sList = forall a b. [a] -> [b] -> [(a, b)]
L.zip [a]
l1 [b]
l2
, sSize :: Size
sSize = forall a. Ord a => a -> a -> a
min Size
s1 Size
s2
}
{-# INLINE zip #-}
zip3 :: Slist a -> Slist b -> Slist c -> Slist (a, b, c)
zip3 :: forall a b c. Slist a -> Slist b -> Slist c -> Slist (a, b, c)
zip3 (Slist [a]
l1 Size
s1) (Slist [b]
l2 Size
s2) (Slist [c]
l3 Size
s3) = Slist
{ sList :: [(a, b, c)]
sList = forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
L.zip3 [a]
l1 [b]
l2 [c]
l3
, sSize :: Size
sSize = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [Size
s1, Size
s2, Size
s3]
}
{-# INLINE zip3 #-}
zipWith :: (a -> b -> c) -> Slist a -> Slist b -> Slist c
zipWith :: forall a b c. (a -> b -> c) -> Slist a -> Slist b -> Slist c
zipWith a -> b -> c
f (Slist [a]
l1 Size
s1) (Slist [b]
l2 Size
s2) = Slist
{ sList :: [c]
sList = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
L.zipWith a -> b -> c
f [a]
l1 [b]
l2
, sSize :: Size
sSize = forall a. Ord a => a -> a -> a
min Size
s1 Size
s2
}
{-# INLINE zipWith #-}
zipWith3 :: (a -> b -> c -> d) -> Slist a -> Slist b -> Slist c -> Slist d
zipWith3 :: forall a b c d.
(a -> b -> c -> d) -> Slist a -> Slist b -> Slist c -> Slist d
zipWith3 a -> b -> c -> d
f (Slist [a]
l1 Size
s1) (Slist [b]
l2 Size
s2) (Slist [c]
l3 Size
s3) = Slist
{ sList :: [d]
sList = forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
L.zipWith3 a -> b -> c -> d
f [a]
l1 [b]
l2 [c]
l3
, sSize :: Size
sSize = forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [Size
s1, Size
s2, Size
s3]
}
{-# INLINE zipWith3 #-}
unzip :: Slist (a, b) -> (Slist a, Slist b)
unzip :: forall a b. Slist (a, b) -> (Slist a, Slist b)
unzip Slist{[(a, b)]
Size
sSize :: Size
sList :: [(a, b)]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let ([a]
as, [b]
bs) = forall a b. [(a, b)] -> ([a], [b])
L.unzip [(a, b)]
sList in (forall a. [a] -> Slist a
l [a]
as, forall a. [a] -> Slist a
l [b]
bs)
where
l :: [x] -> Slist x
l :: forall a. [a] -> Slist a
l [x]
x = forall a. [a] -> Size -> Slist a
Slist [x]
x Size
sSize
{-# INLINE unzip #-}
unzip3 :: Slist (a, b, c) -> (Slist a, Slist b, Slist c)
unzip3 :: forall a b c. Slist (a, b, c) -> (Slist a, Slist b, Slist c)
unzip3 Slist{[(a, b, c)]
Size
sSize :: Size
sList :: [(a, b, c)]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let ([a]
as, [b]
bs, [c]
cs) = forall a b c. [(a, b, c)] -> ([a], [b], [c])
L.unzip3 [(a, b, c)]
sList in (forall a. [a] -> Slist a
l [a]
as, forall a. [a] -> Slist a
l [b]
bs, forall a. [a] -> Slist a
l [c]
cs)
where
l :: [x] -> Slist x
l :: forall a. [a] -> Slist a
l [x]
x = forall a. [a] -> Size -> Slist a
Slist [x]
x Size
sSize
{-# INLINE unzip3 #-}
nub :: Eq a => Slist a -> Slist a
nub :: forall a. Eq a => Slist a -> Slist a
nub = forall a. (a -> a -> Bool) -> Slist a -> Slist a
nubBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE nub #-}
nubBy :: forall a . (a -> a -> Bool) -> Slist a -> Slist a
nubBy :: forall a. (a -> a -> Bool) -> Slist a -> Slist a
nubBy a -> a -> Bool
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Int
s, [a]
l) = Int -> [a] -> [a] -> (Int, [a])
go Int
0 [] [a]
sList in case Size
sSize of
Size
Infinity -> forall a. [a] -> Slist a
infiniteSlist [a]
l
Size
_ -> forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s
where
go :: Int -> [a] -> [a] -> (Int, [a])
go :: Int -> [a] -> [a] -> (Int, [a])
go !Int
n [a]
res [] = (Int
n, [a]
res)
go Int
n [a]
res (a
x:[a]
xs) =
if forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (a -> a -> Bool
f a
x) [a]
res
then Int -> [a] -> [a] -> (Int, [a])
go Int
n [a]
res [a]
xs
else Int -> [a] -> [a] -> (Int, [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) ([a]
res forall a. [a] -> [a] -> [a]
++ [a
x]) [a]
xs
{-# INLINE nubBy #-}
ordNub :: forall a . (Ord a) => Slist a -> Slist a
ordNub :: forall a. Ord a => Slist a -> Slist a
ordNub Slist a
sl = let (Int
s, [a]
l) = Int -> Set a -> [a] -> (Int, [a])
go Int
0 forall a. Set a
Set.empty (forall a. Slist a -> [a]
sList Slist a
sl) in Slist
{ sList :: [a]
sList = [a]
l
, sSize :: Size
sSize = Int -> Size
Size Int
s
}
where
go :: Int -> Set.Set a -> [a] -> (Int, [a])
go :: Int -> Set a -> [a] -> (Int, [a])
go !Int
i Set a
_ [] = (Int
i, [])
go Int
i Set a
s (a
x:[a]
xs) =
if a
x forall a. Ord a => a -> Set a -> Bool
`Set.member` Set a
s
then Int -> Set a -> [a] -> (Int, [a])
go Int
i Set a
s [a]
xs
else forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> Set a -> [a] -> (Int, [a])
go (Int
i forall a. Num a => a -> a -> a
+ Int
1) (forall a. Ord a => a -> Set a -> Set a
Set.insert a
x Set a
s) [a]
xs
{-# INLINEABLE ordNub #-}
delete :: Eq a => a -> Slist a -> Slist a
delete :: forall a. Eq a => a -> Slist a -> Slist a
delete = forall a. (a -> a -> Bool) -> a -> Slist a -> Slist a
deleteBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE delete #-}
deleteBy :: forall a . (a -> a -> Bool) -> a -> Slist a -> Slist a
deleteBy :: forall a. (a -> a -> Bool) -> a -> Slist a -> Slist a
deleteBy a -> a -> Bool
f a
a (Slist [a]
l Size
Infinity) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Bool) -> a -> [a] -> [a]
L.deleteBy a -> a -> Bool
f a
a [a]
l
deleteBy a -> a -> Bool
f a
a Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = let (Size
del, [a]
res) = [a] -> (Size, [a])
go [a]
sList in
forall a. [a] -> Size -> Slist a
Slist [a]
res forall a b. (a -> b) -> a -> b
$ Size
sSize forall a. Num a => a -> a -> a
- Size
del
where
go :: [a] -> (Size, [a])
go :: [a] -> (Size, [a])
go [] = (Int -> Size
Size Int
0, [])
go (a
x:[a]
xs) = if a -> a -> Bool
f a
a a
x
then (Int -> Size
Size Int
1, [a]
xs)
else forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ [a] -> (Size, [a])
go [a]
xs
{-# INLINE deleteBy #-}
deleteFirstsBy :: (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
deleteFirstsBy :: forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
deleteFirstsBy a -> a -> Bool
f = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. (a -> a -> Bool) -> a -> Slist a -> Slist a
deleteBy a -> a -> Bool
f)
{-# INLINE deleteFirstsBy #-}
diff :: Eq a => Slist a -> Slist a -> Slist a
diff :: forall a. Eq a => Slist a -> Slist a -> Slist a
diff = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Eq a => a -> Slist a -> Slist a
delete
{-# INLINE diff #-}
union :: Eq a => Slist a -> Slist a -> Slist a
union :: forall a. Eq a => Slist a -> Slist a -> Slist a
union = forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
unionBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE union #-}
unionBy :: (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
unionBy :: forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
unionBy a -> a -> Bool
f Slist a
xs Slist a
ys = Slist a
xs forall a. Semigroup a => a -> a -> a
<> forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
deleteFirstsBy a -> a -> Bool
f (forall a. (a -> a -> Bool) -> Slist a -> Slist a
nubBy a -> a -> Bool
f Slist a
ys) Slist a
xs
{-# INLINE unionBy #-}
intersect :: Eq a => Slist a -> Slist a -> Slist a
intersect :: forall a. Eq a => Slist a -> Slist a -> Slist a
intersect = forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
intersectBy forall a. Eq a => a -> a -> Bool
(==)
{-# INLINE intersect #-}
intersectBy :: forall a . (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
intersectBy :: forall a. (a -> a -> Bool) -> Slist a -> Slist a -> Slist a
intersectBy a -> a -> Bool
_ (Slist [a]
_ (Size Int
0)) Slist a
_ = forall a. Monoid a => a
mempty
intersectBy a -> a -> Bool
_ Slist a
_ (Slist [a]
_ (Size Int
0)) = forall a. Monoid a => a
mempty
intersectBy a -> a -> Bool
f (Slist [a]
l1 Size
Infinity) (Slist [a]
l2 Size
_) = forall a. [a] -> Slist a
infiniteSlist forall a b. (a -> b) -> a -> b
$ forall a. (a -> a -> Bool) -> [a] -> [a] -> [a]
L.intersectBy a -> a -> Bool
f [a]
l1 [a]
l2
intersectBy a -> a -> Bool
f (Slist [a]
l1 Size
_) (Slist [a]
l2 Size
_) =
let (Int
s, [a]
l) = Int -> [a] -> (Int, [a])
go Int
0 [a]
l1 in forall a. [a] -> Size -> Slist a
Slist [a]
l forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
s
where
go :: Int -> [a] -> (Int, [a])
go :: Int -> [a] -> (Int, [a])
go Int
n [] = (Int
n, [])
go Int
n (a
x:[a]
xs) =
if forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (a -> a -> Bool
f a
x) [a]
l2
then forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (a
xforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ Int -> [a] -> (Int, [a])
go (Int
n forall a. Num a => a -> a -> a
+ Int
1) [a]
xs
else Int -> [a] -> (Int, [a])
go Int
n [a]
xs
{-# INLINE intersectBy #-}
sort :: Ord a => Slist a -> Slist a
sort :: forall a. Ord a => Slist a -> Slist a
sort = forall a. (a -> a -> Ordering) -> Slist a -> Slist a
sortBy forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE sort #-}
sortBy :: (a -> a -> Ordering) -> Slist a -> Slist a
sortBy :: forall a. (a -> a -> Ordering) -> Slist a -> Slist a
sortBy a -> a -> Ordering
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. (a -> a -> Ordering) -> [a] -> [a]
L.sortBy a -> a -> Ordering
f [a]
sList) Size
sSize
{-# INLINE sortBy #-}
sortOn :: Ord b => (a -> b) -> Slist a -> Slist a
sortOn :: forall b a. Ord b => (a -> b) -> Slist a -> Slist a
sortOn a -> b
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn a -> b
f [a]
sList) Size
sSize
{-# INLINE sortOn #-}
sortWith :: Ord b => (a -> b) -> Slist a -> Slist a
sortWith :: forall b a. Ord b => (a -> b) -> Slist a -> Slist a
sortWith a -> b
f Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall b a. Ord b => (a -> b) -> [a] -> [a]
Exts.sortWith a -> b
f [a]
sList) Size
sSize
{-# INLINE sortWith #-}
insert :: Ord a => a -> Slist a -> Slist a
insert :: forall a. Ord a => a -> Slist a -> Slist a
insert = forall a. (a -> a -> Ordering) -> a -> Slist a -> Slist a
insertBy forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE insert #-}
insertBy :: (a -> a -> Ordering) -> a -> Slist a -> Slist a
insertBy :: forall a. (a -> a -> Ordering) -> a -> Slist a -> Slist a
insertBy a -> a -> Ordering
f a
a Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..} = forall a. [a] -> Size -> Slist a
Slist (forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
L.insertBy a -> a -> Ordering
f a
a [a]
sList) (Size
sSize forall a. Num a => a -> a -> a
+ Size
1)
{-# INLINE insertBy #-}
genericLength :: Num i => Slist a -> i
genericLength :: forall i a. Num i => Slist a -> i
genericLength = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Int
length
{-# INLINE genericLength #-}
genericTake :: Integral i => i -> Slist a -> Slist a
genericTake :: forall i a. Integral i => i -> Slist a -> Slist a
genericTake (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Int
i) sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = Slist a
sl
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Monoid a => a
mempty
| Bool
otherwise = Slist
{ sList :: [a]
sList = forall i a. Integral i => i -> [a] -> [a]
L.genericTake Int
i [a]
sList
, sSize :: Size
sSize = forall a. Ord a => a -> a -> a
min Size
sSize (Int -> Size
Size Int
i)
}
{-# INLINE genericTake #-}
genericDrop :: Integral i => i -> Slist a -> Slist a
genericDrop :: forall i a. Integral i => i -> Slist a -> Slist a
genericDrop (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Int
i) sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = Slist a
sl
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = forall a. Monoid a => a
mempty
| Bool
otherwise = Slist
{ sList :: [a]
sList = forall i a. Integral i => i -> [a] -> [a]
L.genericDrop Int
i [a]
sList
, sSize :: Size
sSize = Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
i
}
{-# INLINE genericDrop #-}
genericSplitAt :: Integral i => i -> Slist a -> (Slist a, Slist a)
genericSplitAt :: forall i a. Integral i => i -> Slist a -> (Slist a, Slist a)
genericSplitAt (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Int
i) sl :: Slist a
sl@Slist{[a]
Size
sSize :: Size
sList :: [a]
sSize :: forall a. Slist a -> Size
sList :: forall a. Slist a -> [a]
..}
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = (forall a. Monoid a => a
mempty, Slist a
sl)
| Int -> Size
Size Int
i forall a. Ord a => a -> a -> Bool
>= Size
sSize = (Slist a
sl, forall a. Monoid a => a
mempty)
| Bool
otherwise =
let ([a]
l1, [a]
l2) = forall i a. Integral i => i -> [a] -> ([a], [a])
L.genericSplitAt Int
i [a]
sList
s2 :: Size
s2 = Size
sSize forall a. Num a => a -> a -> a
- Int -> Size
Size Int
i
in (forall a. [a] -> Size -> Slist a
Slist [a]
l1 forall a b. (a -> b) -> a -> b
$ Int -> Size
Size Int
i, forall a. [a] -> Size -> Slist a
Slist [a]
l2 Size
s2)
{-# INLINE genericSplitAt #-}
genericAt :: Integral i => i -> Slist a -> Maybe a
genericAt :: forall i a. Integral i => i -> Slist a -> Maybe a
genericAt = forall a. Int -> Slist a -> Maybe a
at forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
{-# INLINE genericAt #-}
genericUnsafeAt :: Integral i => i -> Slist a -> a
genericUnsafeAt :: forall i a. Integral i => i -> Slist a -> a
genericUnsafeAt i
i Slist a
_ | i
i forall a. Ord a => a -> a -> Bool
< i
0 = forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Slist.genericUnsafeAt: negative argument"
genericUnsafeAt i
i (Slist [a]
l Size
Infinity) = forall i a. Integral i => [a] -> i -> a
L.genericIndex [a]
l i
i
genericUnsafeAt i
i (Slist [a]
l (Size Int
n))
| i
i forall a. Ord a => a -> a -> Bool
>= forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n = forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Slist.genericUnsafeAt: index too large"
| Bool
otherwise = forall i a. Integral i => [a] -> i -> a
L.genericIndex [a]
l i
i
{-# INLINE genericUnsafeAt #-}
genericReplicate :: Integral i => i -> a -> Slist a
genericReplicate :: forall i a. Integral i => i -> a -> Slist a
genericReplicate i
n a
x
| i
n forall a. Ord a => a -> a -> Bool
<= i
0 = forall a. Monoid a => a
mempty
| Bool
otherwise = forall a. [a] -> Size -> Slist a
Slist (forall i a. Integral i => i -> a -> [a]
L.genericReplicate i
n a
x) forall a b. (a -> b) -> a -> b
$ Int -> Size
Size (forall a b. (Integral a, Num b) => a -> b
fromIntegral i
n)
{-# INLINE genericReplicate #-}