{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP, NoImplicitPrelude, ScopedTypeVariables,
MagicHash, BangPatterns #-}
module Data.OldList
(
(++)
, head
, last
, tail
, init
, uncons
, null
, length
, map
, reverse
, intersperse
, intercalate
, transpose
, subsequences
, permutations
, foldl
, foldl'
, foldl1
, foldl1'
, foldr
, foldr1
, concat
, concatMap
, and
, or
, any
, all
, sum
, product
, maximum
, minimum
, scanl
, scanl'
, scanl1
, scanr
, scanr1
, mapAccumL
, mapAccumR
, iterate
, iterate'
, repeat
, replicate
, cycle
, unfoldr
, take
, drop
, splitAt
, takeWhile
, dropWhile
, dropWhileEnd
, span
, break
, stripPrefix
, group
, inits
, tails
, isPrefixOf
, isSuffixOf
, isInfixOf
, elem
, notElem
, lookup
, find
, filter
, partition
, (!!)
, elemIndex
, elemIndices
, findIndex
, findIndices
, zip
, zip3
, zip4, zip5, zip6, zip7
, zipWith
, zipWith3
, zipWith4, zipWith5, zipWith6, zipWith7
, unzip
, unzip3
, unzip4, unzip5, unzip6, unzip7
, lines
, words
, unlines
, unwords
, nub
, delete
, (\\)
, union
, intersect
, sort
, sortOn
, insert
, nubBy
, deleteBy
, deleteFirstsBy
, unionBy
, intersectBy
, groupBy
, sortBy
, insertBy
, maximumBy
, minimumBy
, genericLength
, genericTake
, genericDrop
, genericSplitAt
, genericIndex
, genericReplicate
) where
import Data.Maybe
import Data.Bits ( (.&.) )
import Data.Char ( isSpace )
import Data.Ord ( comparing )
import Data.Tuple ( fst, snd )
import GHC.Num
import GHC.Real
import GHC.List
import GHC.Base
infix 5 \\
dropWhileEnd :: (a -> Bool) -> [a] -> [a]
dropWhileEnd :: (a -> Bool) -> [a] -> [a]
dropWhileEnd p :: a -> Bool
p = (a -> [a] -> [a]) -> [a] -> [a] -> [a]
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr (\x :: a
x xs :: [a]
xs -> if a -> Bool
p a
x Bool -> Bool -> Bool
&& [a] -> Bool
forall a. [a] -> Bool
null [a]
xs then [] else a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs) []
stripPrefix :: Eq a => [a] -> [a] -> Maybe [a]
stripPrefix :: [a] -> [a] -> Maybe [a]
stripPrefix [] ys :: [a]
ys = [a] -> Maybe [a]
forall a. a -> Maybe a
Just [a]
ys
stripPrefix (x :: a
x:xs :: [a]
xs) (y :: a
y:ys :: [a]
ys)
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = [a] -> [a] -> Maybe [a]
forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix [a]
xs [a]
ys
stripPrefix _ _ = Maybe [a]
forall a. Maybe a
Nothing
elemIndex :: Eq a => a -> [a] -> Maybe Int
elemIndex :: a -> [a] -> Maybe Int
elemIndex x :: a
x = (a -> Bool) -> [a] -> Maybe Int
forall a. (a -> Bool) -> [a] -> Maybe Int
findIndex (a
xa -> a -> Bool
forall a. Eq a => a -> a -> Bool
==)
elemIndices :: Eq a => a -> [a] -> [Int]
elemIndices :: a -> [a] -> [Int]
elemIndices x :: a
x = (a -> Bool) -> [a] -> [Int]
forall a. (a -> Bool) -> [a] -> [Int]
findIndices (a
xa -> a -> Bool
forall a. Eq a => a -> a -> Bool
==)
find :: (a -> Bool) -> [a] -> Maybe a
find :: (a -> Bool) -> [a] -> Maybe a
find p :: a -> Bool
p = [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe ([a] -> Maybe a) -> ([a] -> [a]) -> [a] -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
p
findIndex :: (a -> Bool) -> [a] -> Maybe Int
findIndex :: (a -> Bool) -> [a] -> Maybe Int
findIndex p :: a -> Bool
p = [Int] -> Maybe Int
forall a. [a] -> Maybe a
listToMaybe ([Int] -> Maybe Int) -> ([a] -> [Int]) -> [a] -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Bool) -> [a] -> [Int]
forall a. (a -> Bool) -> [a] -> [Int]
findIndices a -> Bool
p
findIndices :: (a -> Bool) -> [a] -> [Int]
#if defined(USE_REPORT_PRELUDE)
findIndices p xs = [ i | (x,i) <- zip xs [0..], p x]
#else
{-# INLINABLE findIndices #-}
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices p :: a -> Bool
p ls :: [a]
ls = (forall b. (Int -> b -> b) -> b -> b) -> [Int]
forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
build ((forall b. (Int -> b -> b) -> b -> b) -> [Int])
-> (forall b. (Int -> b -> b) -> b -> b) -> [Int]
forall a b. (a -> b) -> a -> b
$ \c :: Int -> b -> b
c n :: b
n ->
let go :: a -> (Int# -> b) -> Int# -> b
go x :: a
x r :: Int# -> b
r k :: Int#
k | a -> Bool
p a
x = Int# -> Int
I# Int#
k Int -> b -> b
`c` Int# -> b
r (Int#
k Int# -> Int# -> Int#
+# 1#)
| Bool
otherwise = Int# -> b
r (Int#
k Int# -> Int# -> Int#
+# 1#)
in (a -> (Int# -> b) -> Int# -> b) -> (Int# -> b) -> [a] -> Int# -> b
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr a -> (Int# -> b) -> Int# -> b
go (\_ -> b
n) [a]
ls 0#
#endif /* USE_REPORT_PRELUDE */
isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
isPrefixOf :: [a] -> [a] -> Bool
isPrefixOf [] _ = Bool
True
isPrefixOf _ [] = Bool
False
isPrefixOf (x :: a
x:xs :: [a]
xs) (y :: a
y:ys :: [a]
ys)= a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y Bool -> Bool -> Bool
&& [a] -> [a] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
isPrefixOf [a]
xs [a]
ys
isSuffixOf :: (Eq a) => [a] -> [a] -> Bool
ns :: [a]
ns isSuffixOf :: [a] -> [a] -> Bool
`isSuffixOf` hs :: [a]
hs = Bool -> (Bool -> Bool) -> Maybe Bool -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False Bool -> Bool
forall a. a -> a
id (Maybe Bool -> Bool) -> Maybe Bool -> Bool
forall a b. (a -> b) -> a -> b
$ do
[a]
delta <- [a] -> [a] -> Maybe [a]
forall a b. [a] -> [b] -> Maybe [b]
dropLengthMaybe [a]
ns [a]
hs
Bool -> Maybe Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ [a]
ns [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== [a] -> [a] -> [a]
forall a b. [a] -> [b] -> [b]
dropLength [a]
delta [a]
hs
dropLength :: [a] -> [b] -> [b]
dropLength :: [a] -> [b] -> [b]
dropLength [] y :: [b]
y = [b]
y
dropLength _ [] = []
dropLength (_:x' :: [a]
x') (_:y' :: [b]
y') = [a] -> [b] -> [b]
forall a b. [a] -> [b] -> [b]
dropLength [a]
x' [b]
y'
dropLengthMaybe :: [a] -> [b] -> Maybe [b]
dropLengthMaybe :: [a] -> [b] -> Maybe [b]
dropLengthMaybe [] y :: [b]
y = [b] -> Maybe [b]
forall a. a -> Maybe a
Just [b]
y
dropLengthMaybe _ [] = Maybe [b]
forall a. Maybe a
Nothing
dropLengthMaybe (_:x' :: [a]
x') (_:y' :: [b]
y') = [a] -> [b] -> Maybe [b]
forall a b. [a] -> [b] -> Maybe [b]
dropLengthMaybe [a]
x' [b]
y'
isInfixOf :: (Eq a) => [a] -> [a] -> Bool
isInfixOf :: [a] -> [a] -> Bool
isInfixOf needle :: [a]
needle haystack :: [a]
haystack = ([a] -> Bool) -> [[a]] -> Bool
forall a. (a -> Bool) -> [a] -> Bool
any ([a] -> [a] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
isPrefixOf [a]
needle) ([a] -> [[a]]
forall a. [a] -> [[a]]
tails [a]
haystack)
nub :: (Eq a) => [a] -> [a]
nub :: [a] -> [a]
nub = (a -> a -> Bool) -> [a] -> [a]
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
nubBy :: (a -> a -> Bool) -> [a] -> [a]
#if defined(USE_REPORT_PRELUDE)
nubBy eq [] = []
nubBy eq (x:xs) = x : nubBy eq (filter (\ y -> not (eq x y)) xs)
#else
nubBy :: (a -> a -> Bool) -> [a] -> [a]
nubBy eq :: a -> a -> Bool
eq l :: [a]
l = [a] -> [a] -> [a]
nubBy' [a]
l []
where
nubBy' :: [a] -> [a] -> [a]
nubBy' [] _ = []
nubBy' (y :: a
y:ys :: [a]
ys) xs :: [a]
xs
| (a -> a -> Bool) -> a -> [a] -> Bool
forall a. (a -> a -> Bool) -> a -> [a] -> Bool
elem_by a -> a -> Bool
eq a
y [a]
xs = [a] -> [a] -> [a]
nubBy' [a]
ys [a]
xs
| Bool
otherwise = a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
nubBy' [a]
ys (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
elem_by :: (a -> a -> Bool) -> a -> [a] -> Bool
elem_by :: (a -> a -> Bool) -> a -> [a] -> Bool
elem_by _ _ [] = Bool
False
elem_by eq :: a -> a -> Bool
eq y :: a
y (x :: a
x:xs :: [a]
xs) = a
x a -> a -> Bool
`eq` a
y Bool -> Bool -> Bool
|| (a -> a -> Bool) -> a -> [a] -> Bool
forall a. (a -> a -> Bool) -> a -> [a] -> Bool
elem_by a -> a -> Bool
eq a
y [a]
xs
#endif
delete :: (Eq a) => a -> [a] -> [a]
delete :: a -> [a] -> [a]
delete = (a -> a -> Bool) -> a -> [a] -> [a]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _ _ [] = []
deleteBy eq :: a -> a -> Bool
eq x :: a
x (y :: a
y:ys :: [a]
ys) = if a
x a -> a -> Bool
`eq` a
y then [a]
ys else a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a -> Bool) -> a -> [a] -> [a]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy a -> a -> Bool
eq a
x [a]
ys
(\\) :: (Eq a) => [a] -> [a] -> [a]
\\ :: [a] -> [a] -> [a]
(\\) = ([a] -> a -> [a]) -> [a] -> [a] -> [a]
forall a b. (b -> a -> b) -> b -> [a] -> b
foldl ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> [a] -> [a]
forall a. Eq a => a -> [a] -> [a]
delete)
union :: (Eq a) => [a] -> [a] -> [a]
union :: [a] -> [a] -> [a]
union = (a -> a -> Bool) -> [a] -> [a] -> [a]
forall a. (a -> a -> Bool) -> [a] -> [a] -> [a]
unionBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
unionBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
unionBy eq :: a -> a -> Bool
eq xs :: [a]
xs ys :: [a]
ys = [a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ ([a] -> a -> [a]) -> [a] -> [a] -> [a]
forall a b. (b -> a -> b) -> b -> [a] -> b
foldl ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> a -> Bool) -> a -> [a] -> [a]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy a -> a -> Bool
eq)) ((a -> a -> Bool) -> [a] -> [a]
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy a -> a -> Bool
eq [a]
ys) [a]
xs
intersect :: (Eq a) => [a] -> [a] -> [a]
intersect :: [a] -> [a] -> [a]
intersect = (a -> a -> Bool) -> [a] -> [a] -> [a]
forall a. (a -> a -> Bool) -> [a] -> [a] -> [a]
intersectBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
intersectBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
intersectBy _ [] _ = []
intersectBy _ _ [] = []
intersectBy eq :: a -> a -> Bool
eq xs :: [a]
xs ys :: [a]
ys = [a
x | a
x <- [a]
xs, (a -> Bool) -> [a] -> Bool
forall a. (a -> Bool) -> [a] -> Bool
any (a -> a -> Bool
eq a
x) [a]
ys]
intersperse :: a -> [a] -> [a]
intersperse :: a -> [a] -> [a]
intersperse _ [] = []
intersperse sep :: a
sep (x :: a
x:xs :: [a]
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
forall a. a -> [a] -> [a]
prependToAll a
sep [a]
xs
prependToAll :: a -> [a] -> [a]
prependToAll :: a -> [a] -> [a]
prependToAll _ [] = []
prependToAll sep :: a
sep (x :: a
x:xs :: [a]
xs) = a
sep a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
forall a. a -> [a] -> [a]
prependToAll a
sep [a]
xs
intercalate :: [a] -> [[a]] -> [a]
intercalate :: [a] -> [[a]] -> [a]
intercalate xs :: [a]
xs xss :: [[a]]
xss = [[a]] -> [a]
forall a. [[a]] -> [a]
concat ([a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
intersperse [a]
xs [[a]]
xss)
transpose :: [[a]] -> [[a]]
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss :: [[a]]
xss) = [[a]] -> [[a]]
forall a. [[a]] -> [[a]]
transpose [[a]]
xss
transpose ((x :: a
x:xs :: [a]
xs) : xss :: [[a]]
xss) = (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a
h | (h :: a
h:_) <- [[a]]
xss]) [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]] -> [[a]]
forall a. [[a]] -> [[a]]
transpose ([a]
xs [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [ [a]
t | (_:t :: [a]
t) <- [[a]]
xss])
partition :: (a -> Bool) -> [a] -> ([a],[a])
{-# INLINE partition #-}
partition :: (a -> Bool) -> [a] -> ([a], [a])
partition p :: a -> Bool
p xs :: [a]
xs = (a -> ([a], [a]) -> ([a], [a])) -> ([a], [a]) -> [a] -> ([a], [a])
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr ((a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
forall a. (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
select a -> Bool
p) ([],[]) [a]
xs
select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
select p :: a -> Bool
p x :: a
x ~(ts :: [a]
ts,fs :: [a]
fs) | a -> Bool
p a
x = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ts,[a]
fs)
| Bool
otherwise = ([a]
ts, a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
fs)
mapAccumL :: (acc -> x -> (acc, y))
-> acc
-> [x]
-> (acc, [y])
{-# NOINLINE [1] mapAccumL #-}
mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
mapAccumL _ s :: acc
s [] = (acc
s, [])
mapAccumL f :: acc -> x -> (acc, y)
f s :: acc
s (x :: x
x:xs :: [x]
xs) = (acc
s'',y
yy -> [y] -> [y]
forall a. a -> [a] -> [a]
:[y]
ys)
where (s' :: acc
s', y :: y
y ) = acc -> x -> (acc, y)
f acc
s x
x
(s'' :: acc
s'',ys :: [y]
ys) = (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
forall acc x y. (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
mapAccumL acc -> x -> (acc, y)
f acc
s' [x]
xs
{-# RULES
"mapAccumL" [~1] forall f s xs . mapAccumL f s xs = foldr (mapAccumLF f) pairWithNil xs s
"mapAccumLList" [1] forall f s xs . foldr (mapAccumLF f) pairWithNil xs s = mapAccumL f s xs
#-}
pairWithNil :: acc -> (acc, [y])
{-# INLINE [0] pairWithNil #-}
pairWithNil :: acc -> (acc, [y])
pairWithNil x :: acc
x = (acc
x, [])
mapAccumLF :: (acc -> x -> (acc, y)) -> x -> (acc -> (acc, [y])) -> acc -> (acc, [y])
{-# INLINE [0] mapAccumLF #-}
mapAccumLF :: (acc -> x -> (acc, y))
-> x -> (acc -> (acc, [y])) -> acc -> (acc, [y])
mapAccumLF f :: acc -> x -> (acc, y)
f = \x :: x
x r :: acc -> (acc, [y])
r -> (acc -> (acc, [y])) -> acc -> (acc, [y])
oneShot (\s :: acc
s ->
let (s' :: acc
s', y :: y
y) = acc -> x -> (acc, y)
f acc
s x
x
(s'' :: acc
s'', ys :: [y]
ys) = acc -> (acc, [y])
r acc
s'
in (acc
s'', y
yy -> [y] -> [y]
forall a. a -> [a] -> [a]
:[y]
ys))
mapAccumR :: (acc -> x -> (acc, y))
-> acc
-> [x]
-> (acc, [y])
mapAccumR :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
mapAccumR _ s :: acc
s [] = (acc
s, [])
mapAccumR f :: acc -> x -> (acc, y)
f s :: acc
s (x :: x
x:xs :: [x]
xs) = (acc
s'', y
yy -> [y] -> [y]
forall a. a -> [a] -> [a]
:[y]
ys)
where (s'' :: acc
s'',y :: y
y ) = acc -> x -> (acc, y)
f acc
s' x
x
(s' :: acc
s', ys :: [y]
ys) = (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
forall acc x y. (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
mapAccumR acc -> x -> (acc, y)
f acc
s [x]
xs
insert :: Ord a => a -> [a] -> [a]
insert :: a -> [a] -> [a]
insert e :: a
e ls :: [a]
ls = (a -> a -> Ordering) -> a -> [a] -> [a]
forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy (a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare) a
e [a]
ls
insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy _ x :: a
x [] = [a
x]
insertBy cmp :: a -> a -> Ordering
cmp x :: a
x ys :: [a]
ys@(y :: a
y:ys' :: [a]
ys')
= case a -> a -> Ordering
cmp a
x a
y of
GT -> a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a -> Ordering) -> a -> [a] -> [a]
forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy a -> a -> Ordering
cmp a
x [a]
ys'
_ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys
maximumBy :: (a -> a -> Ordering) -> [a] -> a
maximumBy :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ [] = [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace "List.maximumBy: empty list"
maximumBy cmp :: a -> a -> Ordering
cmp xs :: [a]
xs = (a -> a -> a) -> [a] -> a
forall a. (a -> a -> a) -> [a] -> a
foldl1 a -> a -> a
maxBy [a]
xs
where
maxBy :: a -> a -> a
maxBy x :: a
x y :: a
y = case a -> a -> Ordering
cmp a
x a
y of
GT -> a
x
_ -> a
y
minimumBy :: (a -> a -> Ordering) -> [a] -> a
minimumBy :: (a -> a -> Ordering) -> [a] -> a
minimumBy _ [] = [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace "List.minimumBy: empty list"
minimumBy cmp :: a -> a -> Ordering
cmp xs :: [a]
xs = (a -> a -> a) -> [a] -> a
forall a. (a -> a -> a) -> [a] -> a
foldl1 a -> a -> a
minBy [a]
xs
where
minBy :: a -> a -> a
minBy x :: a
x y :: a
y = case a -> a -> Ordering
cmp a
x a
y of
GT -> a
y
_ -> a
x
genericLength :: (Num i) => [a] -> i
{-# NOINLINE [1] genericLength #-}
genericLength :: [a] -> i
genericLength [] = 0
genericLength (_:l :: [a]
l) = 1 i -> i -> i
forall a. Num a => a -> a -> a
+ [a] -> i
forall i a. Num i => [a] -> i
genericLength [a]
l
{-# RULES
"genericLengthInt" genericLength = (strictGenericLength :: [a] -> Int);
"genericLengthInteger" genericLength = (strictGenericLength :: [a] -> Integer);
#-}
strictGenericLength :: (Num i) => [b] -> i
strictGenericLength :: [b] -> i
strictGenericLength l :: [b]
l = [b] -> i -> i
forall t a. Num t => [a] -> t -> t
gl [b]
l 0
where
gl :: [a] -> t -> t
gl [] a :: t
a = t
a
gl (_:xs :: [a]
xs) a :: t
a = let a' :: t
a' = t
a t -> t -> t
forall a. Num a => a -> a -> a
+ 1 in t
a' t -> t -> t
forall a b. a -> b -> b
`seq` [a] -> t -> t
gl [a]
xs t
a'
genericTake :: (Integral i) => i -> [a] -> [a]
genericTake :: i -> [a] -> [a]
genericTake n :: i
n _ | i
n i -> i -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = []
genericTake _ [] = []
genericTake n :: i
n (x :: a
x:xs :: [a]
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: i -> [a] -> [a]
forall i a. Integral i => i -> [a] -> [a]
genericTake (i
ni -> i -> i
forall a. Num a => a -> a -> a
-1) [a]
xs
genericDrop :: (Integral i) => i -> [a] -> [a]
genericDrop :: i -> [a] -> [a]
genericDrop n :: i
n xs :: [a]
xs | i
n i -> i -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = [a]
xs
genericDrop _ [] = []
genericDrop n :: i
n (_:xs :: [a]
xs) = i -> [a] -> [a]
forall i a. Integral i => i -> [a] -> [a]
genericDrop (i
ni -> i -> i
forall a. Num a => a -> a -> a
-1) [a]
xs
genericSplitAt :: (Integral i) => i -> [a] -> ([a], [a])
genericSplitAt :: i -> [a] -> ([a], [a])
genericSplitAt n :: i
n xs :: [a]
xs | i
n i -> i -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = ([],[a]
xs)
genericSplitAt _ [] = ([],[])
genericSplitAt n :: i
n (x :: a
x:xs :: [a]
xs) = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs',[a]
xs'') where
(xs' :: [a]
xs',xs'' :: [a]
xs'') = i -> [a] -> ([a], [a])
forall i a. Integral i => i -> [a] -> ([a], [a])
genericSplitAt (i
ni -> i -> i
forall a. Num a => a -> a -> a
-1) [a]
xs
genericIndex :: (Integral i) => [a] -> i -> a
genericIndex :: [a] -> i -> a
genericIndex (x :: a
x:_) 0 = a
x
genericIndex (_:xs :: [a]
xs) n :: i
n
| i
n i -> i -> Bool
forall a. Ord a => a -> a -> Bool
> 0 = [a] -> i -> a
forall i a. Integral i => [a] -> i -> a
genericIndex [a]
xs (i
ni -> i -> i
forall a. Num a => a -> a -> a
-1)
| Bool
otherwise = [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace "List.genericIndex: negative argument."
genericIndex _ _ = [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace "List.genericIndex: index too large."
genericReplicate :: (Integral i) => i -> a -> [a]
genericReplicate :: i -> a -> [a]
genericReplicate n :: i
n x :: a
x = i -> [a] -> [a]
forall i a. Integral i => i -> [a] -> [a]
genericTake i
n (a -> [a]
forall a. a -> [a]
repeat a
x)
{-# INLINE zip4 #-}
zip4 :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)]
zip4 :: [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
zip4 = (a -> b -> c -> d -> (a, b, c, d))
-> [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
zipWith4 (,,,)
{-# INLINE zip5 #-}
zip5 :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)]
zip5 :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a, b, c, d, e)]
zip5 = (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> [a] -> [b] -> [c] -> [d] -> [e] -> [(a, b, c, d, e)]
forall a b c d e f.
(a -> b -> c -> d -> e -> f)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f]
zipWith5 (,,,,)
{-# INLINE zip6 #-}
zip6 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->
[(a,b,c,d,e,f)]
zip6 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [(a, b, c, d, e, f)]
zip6 = (a -> b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [(a, b, c, d, e, f)]
forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]
zipWith6 (,,,,,)
{-# INLINE zip7 #-}
zip7 :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->
[g] -> [(a,b,c,d,e,f,g)]
zip7 :: [a]
-> [b]
-> [c]
-> [d]
-> [e]
-> [f]
-> [g]
-> [(a, b, c, d, e, f, g)]
zip7 = (a -> b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> [a]
-> [b]
-> [c]
-> [d]
-> [e]
-> [f]
-> [g]
-> [(a, b, c, d, e, f, g)]
forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [h]
zipWith7 (,,,,,,)
{-# NOINLINE [1] zipWith4 #-}
zipWith4 :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e]
zipWith4 :: (a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
zipWith4 z :: a -> b -> c -> d -> e
z (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds)
= a -> b -> c -> d -> e
z a
a b
b c
c d
d e -> [e] -> [e]
forall a. a -> [a] -> [a]
: (a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
zipWith4 a -> b -> c -> d -> e
z [a]
as [b]
bs [c]
cs [d]
ds
zipWith4 _ _ _ _ _ = []
{-# NOINLINE [1] zipWith5 #-}
zipWith5 :: (a->b->c->d->e->f) ->
[a]->[b]->[c]->[d]->[e]->[f]
zipWith5 :: (a -> b -> c -> d -> e -> f)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f]
zipWith5 z :: a -> b -> c -> d -> e -> f
z (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es)
= a -> b -> c -> d -> e -> f
z a
a b
b c
c d
d e
e f -> [f] -> [f]
forall a. a -> [a] -> [a]
: (a -> b -> c -> d -> e -> f)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f]
forall a b c d e f.
(a -> b -> c -> d -> e -> f)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f]
zipWith5 a -> b -> c -> d -> e -> f
z [a]
as [b]
bs [c]
cs [d]
ds [e]
es
zipWith5 _ _ _ _ _ _ = []
{-# NOINLINE [1] zipWith6 #-}
zipWith6 :: (a->b->c->d->e->f->g) ->
[a]->[b]->[c]->[d]->[e]->[f]->[g]
zipWith6 :: (a -> b -> c -> d -> e -> f -> g)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]
zipWith6 z :: a -> b -> c -> d -> e -> f -> g
z (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs)
= a -> b -> c -> d -> e -> f -> g
z a
a b
b c
c d
d e
e f
f g -> [g] -> [g]
forall a. a -> [a] -> [a]
: (a -> b -> c -> d -> e -> f -> g)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]
forall a b c d e f g.
(a -> b -> c -> d -> e -> f -> g)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]
zipWith6 a -> b -> c -> d -> e -> f -> g
z [a]
as [b]
bs [c]
cs [d]
ds [e]
es [f]
fs
zipWith6 _ _ _ _ _ _ _ = []
{-# NOINLINE [1] zipWith7 #-}
zipWith7 :: (a->b->c->d->e->f->g->h) ->
[a]->[b]->[c]->[d]->[e]->[f]->[g]->[h]
zipWith7 :: (a -> b -> c -> d -> e -> f -> g -> h)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [h]
zipWith7 z :: a -> b -> c -> d -> e -> f -> g -> h
z (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs) (g :: g
g:gs :: [g]
gs)
= a -> b -> c -> d -> e -> f -> g -> h
z a
a b
b c
c d
d e
e f
f g
g h -> [h] -> [h]
forall a. a -> [a] -> [a]
: (a -> b -> c -> d -> e -> f -> g -> h)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [h]
forall a b c d e f g h.
(a -> b -> c -> d -> e -> f -> g -> h)
-> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> [h]
zipWith7 a -> b -> c -> d -> e -> f -> g -> h
z [a]
as [b]
bs [c]
cs [d]
ds [e]
es [f]
fs [g]
gs
zipWith7 _ _ _ _ _ _ _ _ = []
{-# INLINE [0] zipWith4FB #-}
zipWith4FB :: (e->xs->xs') -> (a->b->c->d->e) ->
a->b->c->d->xs->xs'
zipWith4FB :: (e -> xs -> xs')
-> (a -> b -> c -> d -> e) -> a -> b -> c -> d -> xs -> xs'
zipWith4FB cons :: e -> xs -> xs'
cons func :: a -> b -> c -> d -> e
func = \a :: a
a b :: b
b c :: c
c d :: d
d r :: xs
r -> (a -> b -> c -> d -> e
func a
a b
b c
c d
d) e -> xs -> xs'
`cons` xs
r
{-# INLINE [0] zipWith5FB #-}
zipWith5FB :: (f->xs->xs') -> (a->b->c->d->e->f) ->
a->b->c->d->e->xs->xs'
zipWith5FB :: (f -> xs -> xs')
-> (a -> b -> c -> d -> e -> f)
-> a
-> b
-> c
-> d
-> e
-> xs
-> xs'
zipWith5FB cons :: f -> xs -> xs'
cons func :: a -> b -> c -> d -> e -> f
func = \a :: a
a b :: b
b c :: c
c d :: d
d e :: e
e r :: xs
r -> (a -> b -> c -> d -> e -> f
func a
a b
b c
c d
d e
e) f -> xs -> xs'
`cons` xs
r
{-# INLINE [0] zipWith6FB #-}
zipWith6FB :: (g->xs->xs') -> (a->b->c->d->e->f->g) ->
a->b->c->d->e->f->xs->xs'
zipWith6FB :: (g -> xs -> xs')
-> (a -> b -> c -> d -> e -> f -> g)
-> a
-> b
-> c
-> d
-> e
-> f
-> xs
-> xs'
zipWith6FB cons :: g -> xs -> xs'
cons func :: a -> b -> c -> d -> e -> f -> g
func = \a :: a
a b :: b
b c :: c
c d :: d
d e :: e
e f :: f
f r :: xs
r -> (a -> b -> c -> d -> e -> f -> g
func a
a b
b c
c d
d e
e f
f) g -> xs -> xs'
`cons` xs
r
{-# INLINE [0] zipWith7FB #-}
zipWith7FB :: (h->xs->xs') -> (a->b->c->d->e->f->g->h) ->
a->b->c->d->e->f->g->xs->xs'
zipWith7FB :: (h -> xs -> xs')
-> (a -> b -> c -> d -> e -> f -> g -> h)
-> a
-> b
-> c
-> d
-> e
-> f
-> g
-> xs
-> xs'
zipWith7FB cons :: h -> xs -> xs'
cons func :: a -> b -> c -> d -> e -> f -> g -> h
func = \a :: a
a b :: b
b c :: c
c d :: d
d e :: e
e f :: f
f g :: g
g r :: xs
r -> (a -> b -> c -> d -> e -> f -> g -> h
func a
a b
b c
c d
d e
e f
f g
g) h -> xs -> xs'
`cons` xs
r
{-# INLINE [0] foldr4 #-}
foldr4 :: (a->b->c->d->e->e) ->
e->[a]->[b]->[c]->[d]->e
foldr4 :: (a -> b -> c -> d -> e -> e) -> e -> [a] -> [b] -> [c] -> [d] -> e
foldr4 k :: a -> b -> c -> d -> e -> e
k z :: e
z = [a] -> [b] -> [c] -> [d] -> e
go
where
go :: [a] -> [b] -> [c] -> [d] -> e
go (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) = a -> b -> c -> d -> e -> e
k a
a b
b c
c d
d ([a] -> [b] -> [c] -> [d] -> e
go [a]
as [b]
bs [c]
cs [d]
ds)
go _ _ _ _ = e
z
{-# INLINE [0] foldr5 #-}
foldr5 :: (a->b->c->d->e->f->f) ->
f->[a]->[b]->[c]->[d]->[e]->f
foldr5 :: (a -> b -> c -> d -> e -> f -> f)
-> f -> [a] -> [b] -> [c] -> [d] -> [e] -> f
foldr5 k :: a -> b -> c -> d -> e -> f -> f
k z :: f
z = [a] -> [b] -> [c] -> [d] -> [e] -> f
go
where
go :: [a] -> [b] -> [c] -> [d] -> [e] -> f
go (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) = a -> b -> c -> d -> e -> f -> f
k a
a b
b c
c d
d e
e ([a] -> [b] -> [c] -> [d] -> [e] -> f
go [a]
as [b]
bs [c]
cs [d]
ds [e]
es)
go _ _ _ _ _ = f
z
{-# INLINE [0] foldr6 #-}
foldr6 :: (a->b->c->d->e->f->g->g) ->
g->[a]->[b]->[c]->[d]->[e]->[f]->g
foldr6 :: (a -> b -> c -> d -> e -> f -> g -> g)
-> g -> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> g
foldr6 k :: a -> b -> c -> d -> e -> f -> g -> g
k z :: g
z = [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> g
go
where
go :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> g
go (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs) = a -> b -> c -> d -> e -> f -> g -> g
k a
a b
b c
c d
d e
e f
f (
[a] -> [b] -> [c] -> [d] -> [e] -> [f] -> g
go [a]
as [b]
bs [c]
cs [d]
ds [e]
es [f]
fs)
go _ _ _ _ _ _ = g
z
{-# INLINE [0] foldr7 #-}
foldr7 :: (a->b->c->d->e->f->g->h->h) ->
h->[a]->[b]->[c]->[d]->[e]->[f]->[g]->h
foldr7 :: (a -> b -> c -> d -> e -> f -> g -> h -> h)
-> h -> [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
foldr7 k :: a -> b -> c -> d -> e -> f -> g -> h -> h
k z :: h
z = [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
go
where
go :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
go (a :: a
a:as :: [a]
as) (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs) (g :: g
g:gs :: [g]
gs) = a -> b -> c -> d -> e -> f -> g -> h -> h
k a
a b
b c
c d
d e
e f
f g
g (
[a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
go [a]
as [b]
bs [c]
cs [d]
ds [e]
es [f]
fs [g]
gs)
go _ _ _ _ _ _ _ = h
z
foldr4_left :: (a->b->c->d->e->f)->
f->a->([b]->[c]->[d]->e)->
[b]->[c]->[d]->f
foldr4_left :: (a -> b -> c -> d -> e -> f)
-> f -> a -> ([b] -> [c] -> [d] -> e) -> [b] -> [c] -> [d] -> f
foldr4_left k :: a -> b -> c -> d -> e -> f
k _z :: f
_z a :: a
a r :: [b] -> [c] -> [d] -> e
r (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) = a -> b -> c -> d -> e -> f
k a
a b
b c
c d
d ([b] -> [c] -> [d] -> e
r [b]
bs [c]
cs [d]
ds)
foldr4_left _ z :: f
z _ _ _ _ _ = f
z
foldr5_left :: (a->b->c->d->e->f->g)->
g->a->([b]->[c]->[d]->[e]->f)->
[b]->[c]->[d]->[e]->g
foldr5_left :: (a -> b -> c -> d -> e -> f -> g)
-> g
-> a
-> ([b] -> [c] -> [d] -> [e] -> f)
-> [b]
-> [c]
-> [d]
-> [e]
-> g
foldr5_left k :: a -> b -> c -> d -> e -> f -> g
k _z :: g
_z a :: a
a r :: [b] -> [c] -> [d] -> [e] -> f
r (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) = a -> b -> c -> d -> e -> f -> g
k a
a b
b c
c d
d e
e ([b] -> [c] -> [d] -> [e] -> f
r [b]
bs [c]
cs [d]
ds [e]
es)
foldr5_left _ z :: g
z _ _ _ _ _ _ = g
z
foldr6_left :: (a->b->c->d->e->f->g->h)->
h->a->([b]->[c]->[d]->[e]->[f]->g)->
[b]->[c]->[d]->[e]->[f]->h
foldr6_left :: (a -> b -> c -> d -> e -> f -> g -> h)
-> h
-> a
-> ([b] -> [c] -> [d] -> [e] -> [f] -> g)
-> [b]
-> [c]
-> [d]
-> [e]
-> [f]
-> h
foldr6_left k :: a -> b -> c -> d -> e -> f -> g -> h
k _z :: h
_z a :: a
a r :: [b] -> [c] -> [d] -> [e] -> [f] -> g
r (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs) =
a -> b -> c -> d -> e -> f -> g -> h
k a
a b
b c
c d
d e
e f
f ([b] -> [c] -> [d] -> [e] -> [f] -> g
r [b]
bs [c]
cs [d]
ds [e]
es [f]
fs)
foldr6_left _ z :: h
z _ _ _ _ _ _ _ = h
z
foldr7_left :: (a->b->c->d->e->f->g->h->i)->
i->a->([b]->[c]->[d]->[e]->[f]->[g]->h)->
[b]->[c]->[d]->[e]->[f]->[g]->i
foldr7_left :: (a -> b -> c -> d -> e -> f -> g -> h -> i)
-> i
-> a
-> ([b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h)
-> [b]
-> [c]
-> [d]
-> [e]
-> [f]
-> [g]
-> i
foldr7_left k :: a -> b -> c -> d -> e -> f -> g -> h -> i
k _z :: i
_z a :: a
a r :: [b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
r (b :: b
b:bs :: [b]
bs) (c :: c
c:cs :: [c]
cs) (d :: d
d:ds :: [d]
ds) (e :: e
e:es :: [e]
es) (f :: f
f:fs :: [f]
fs) (g :: g
g:gs :: [g]
gs) =
a -> b -> c -> d -> e -> f -> g -> h -> i
k a
a b
b c
c d
d e
e f
f g
g ([b] -> [c] -> [d] -> [e] -> [f] -> [g] -> h
r [b]
bs [c]
cs [d]
ds [e]
es [f]
fs [g]
gs)
foldr7_left _ z :: i
z _ _ _ _ _ _ _ _ = i
z
{-# RULES
"foldr4/left" forall k z (g::forall b.(a->b->b)->b->b).
foldr4 k z (build g) = g (foldr4_left k z) (\_ _ _ -> z)
"foldr5/left" forall k z (g::forall b.(a->b->b)->b->b).
foldr5 k z (build g) = g (foldr5_left k z) (\_ _ _ _ -> z)
"foldr6/left" forall k z (g::forall b.(a->b->b)->b->b).
foldr6 k z (build g) = g (foldr6_left k z) (\_ _ _ _ _ -> z)
"foldr7/left" forall k z (g::forall b.(a->b->b)->b->b).
foldr7 k z (build g) = g (foldr7_left k z) (\_ _ _ _ _ _ -> z)
"zipWith4" [~1] forall f as bs cs ds.
zipWith4 f as bs cs ds = build (\c n ->
foldr4 (zipWith4FB c f) n as bs cs ds)
"zipWith5" [~1] forall f as bs cs ds es.
zipWith5 f as bs cs ds es = build (\c n ->
foldr5 (zipWith5FB c f) n as bs cs ds es)
"zipWith6" [~1] forall f as bs cs ds es fs.
zipWith6 f as bs cs ds es fs = build (\c n ->
foldr6 (zipWith6FB c f) n as bs cs ds es fs)
"zipWith7" [~1] forall f as bs cs ds es fs gs.
zipWith7 f as bs cs ds es fs gs = build (\c n ->
foldr7 (zipWith7FB c f) n as bs cs ds es fs gs)
"zipWith4List" [1] forall f. foldr4 (zipWith4FB (:) f) [] = zipWith4 f
"zipWith5List" [1] forall f. foldr5 (zipWith5FB (:) f) [] = zipWith5 f
"zipWith6List" [1] forall f. foldr6 (zipWith6FB (:) f) [] = zipWith6 f
"zipWith7List" [1] forall f. foldr7 (zipWith7FB (:) f) [] = zipWith7 f
#-}
unzip4 :: [(a,b,c,d)] -> ([a],[b],[c],[d])
unzip4 :: [(a, b, c, d)] -> ([a], [b], [c], [d])
unzip4 = ((a, b, c, d) -> ([a], [b], [c], [d]) -> ([a], [b], [c], [d]))
-> ([a], [b], [c], [d]) -> [(a, b, c, d)] -> ([a], [b], [c], [d])
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr (\(a :: a
a,b :: b
b,c :: c
c,d :: d
d) ~(as :: [a]
as,bs :: [b]
bs,cs :: [c]
cs,ds :: [d]
ds) ->
(a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as,b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
bs,c
cc -> [c] -> [c]
forall a. a -> [a] -> [a]
:[c]
cs,d
dd -> [d] -> [d]
forall a. a -> [a] -> [a]
:[d]
ds))
([],[],[],[])
unzip5 :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e])
unzip5 :: [(a, b, c, d, e)] -> ([a], [b], [c], [d], [e])
unzip5 = ((a, b, c, d, e)
-> ([a], [b], [c], [d], [e]) -> ([a], [b], [c], [d], [e]))
-> ([a], [b], [c], [d], [e])
-> [(a, b, c, d, e)]
-> ([a], [b], [c], [d], [e])
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr (\(a :: a
a,b :: b
b,c :: c
c,d :: d
d,e :: e
e) ~(as :: [a]
as,bs :: [b]
bs,cs :: [c]
cs,ds :: [d]
ds,es :: [e]
es) ->
(a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as,b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
bs,c
cc -> [c] -> [c]
forall a. a -> [a] -> [a]
:[c]
cs,d
dd -> [d] -> [d]
forall a. a -> [a] -> [a]
:[d]
ds,e
ee -> [e] -> [e]
forall a. a -> [a] -> [a]
:[e]
es))
([],[],[],[],[])
unzip6 :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f])
unzip6 :: [(a, b, c, d, e, f)] -> ([a], [b], [c], [d], [e], [f])
unzip6 = ((a, b, c, d, e, f)
-> ([a], [b], [c], [d], [e], [f])
-> ([a], [b], [c], [d], [e], [f]))
-> ([a], [b], [c], [d], [e], [f])
-> [(a, b, c, d, e, f)]
-> ([a], [b], [c], [d], [e], [f])
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr (\(a :: a
a,b :: b
b,c :: c
c,d :: d
d,e :: e
e,f :: f
f) ~(as :: [a]
as,bs :: [b]
bs,cs :: [c]
cs,ds :: [d]
ds,es :: [e]
es,fs :: [f]
fs) ->
(a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as,b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
bs,c
cc -> [c] -> [c]
forall a. a -> [a] -> [a]
:[c]
cs,d
dd -> [d] -> [d]
forall a. a -> [a] -> [a]
:[d]
ds,e
ee -> [e] -> [e]
forall a. a -> [a] -> [a]
:[e]
es,f
ff -> [f] -> [f]
forall a. a -> [a] -> [a]
:[f]
fs))
([],[],[],[],[],[])
unzip7 :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g])
unzip7 :: [(a, b, c, d, e, f, g)] -> ([a], [b], [c], [d], [e], [f], [g])
unzip7 = ((a, b, c, d, e, f, g)
-> ([a], [b], [c], [d], [e], [f], [g])
-> ([a], [b], [c], [d], [e], [f], [g]))
-> ([a], [b], [c], [d], [e], [f], [g])
-> [(a, b, c, d, e, f, g)]
-> ([a], [b], [c], [d], [e], [f], [g])
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr (\(a :: a
a,b :: b
b,c :: c
c,d :: d
d,e :: e
e,f :: f
f,g :: g
g) ~(as :: [a]
as,bs :: [b]
bs,cs :: [c]
cs,ds :: [d]
ds,es :: [e]
es,fs :: [f]
fs,gs :: [g]
gs) ->
(a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as,b
bb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
bs,c
cc -> [c] -> [c]
forall a. a -> [a] -> [a]
:[c]
cs,d
dd -> [d] -> [d]
forall a. a -> [a] -> [a]
:[d]
ds,e
ee -> [e] -> [e]
forall a. a -> [a] -> [a]
:[e]
es,f
ff -> [f] -> [f]
forall a. a -> [a] -> [a]
:[f]
fs,g
gg -> [g] -> [g]
forall a. a -> [a] -> [a]
:[g]
gs))
([],[],[],[],[],[],[])
deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
deleteFirstsBy :: (a -> a -> Bool) -> [a] -> [a] -> [a]
deleteFirstsBy eq :: a -> a -> Bool
eq = ([a] -> a -> [a]) -> [a] -> [a] -> [a]
forall a b. (b -> a -> b) -> b -> [a] -> b
foldl ((a -> [a] -> [a]) -> [a] -> a -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((a -> a -> Bool) -> a -> [a] -> [a]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy a -> a -> Bool
eq))
group :: Eq a => [a] -> [[a]]
group :: [a] -> [[a]]
group = (a -> a -> Bool) -> [a] -> [[a]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==)
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _ [] = []
groupBy eq :: a -> a -> Bool
eq (x :: a
x:xs :: [a]
xs) = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys) [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: (a -> a -> Bool) -> [a] -> [[a]]
forall a. (a -> a -> Bool) -> [a] -> [[a]]
groupBy a -> a -> Bool
eq [a]
zs
where (ys :: [a]
ys,zs :: [a]
zs) = (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (a -> a -> Bool
eq a
x) [a]
xs
inits :: [a] -> [[a]]
inits :: [a] -> [[a]]
inits = (SnocBuilder a -> [a]) -> [SnocBuilder a] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map SnocBuilder a -> [a]
forall a. SnocBuilder a -> [a]
toListSB ([SnocBuilder a] -> [[a]])
-> ([a] -> [SnocBuilder a]) -> [a] -> [[a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SnocBuilder a -> a -> SnocBuilder a)
-> SnocBuilder a -> [a] -> [SnocBuilder a]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl' SnocBuilder a -> a -> SnocBuilder a
forall a. SnocBuilder a -> a -> SnocBuilder a
snocSB SnocBuilder a
forall a. SnocBuilder a
emptySB
{-# NOINLINE inits #-}
tails :: [a] -> [[a]]
{-# INLINABLE tails #-}
tails :: [a] -> [[a]]
tails lst :: [a]
lst = (forall b. ([a] -> b -> b) -> b -> b) -> [[a]]
forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
build (\c :: [a] -> b -> b
c n :: b
n ->
let tailsGo :: [a] -> b
tailsGo xs :: [a]
xs = [a]
xs [a] -> b -> b
`c` case [a]
xs of
[] -> b
n
_ : xs' -> [a] -> b
tailsGo [a]
xs'
in [a] -> b
tailsGo [a]
lst)
subsequences :: [a] -> [[a]]
subsequences :: [a] -> [[a]]
subsequences xs :: [a]
xs = [] [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
forall a. [a] -> [[a]]
nonEmptySubsequences [a]
xs
nonEmptySubsequences :: [a] -> [[a]]
nonEmptySubsequences :: [a] -> [[a]]
nonEmptySubsequences [] = []
nonEmptySubsequences (x :: a
x:xs :: [a]
xs) = [a
x] [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: ([a] -> [[a]] -> [[a]]) -> [[a]] -> [[a]] -> [[a]]
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr [a] -> [[a]] -> [[a]]
f [] ([a] -> [[a]]
forall a. [a] -> [[a]]
nonEmptySubsequences [a]
xs)
where f :: [a] -> [[a]] -> [[a]]
f ys :: [a]
ys r :: [[a]]
r = [a]
ys [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys) [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]]
r
permutations :: [a] -> [[a]]
permutations :: [a] -> [[a]]
permutations xs0 :: [a]
xs0 = [a]
xs0 [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [[a]]
forall a. [a] -> [a] -> [[a]]
perms [a]
xs0 []
where
perms :: [a] -> [a] -> [[a]]
perms [] _ = []
perms (t :: a
t:ts :: [a]
ts) is :: [a]
is = ([a] -> [[a]] -> [[a]]) -> [[a]] -> [[a]] -> [[a]]
forall a b. (a -> b -> b) -> b -> [a] -> b
foldr [a] -> [[a]] -> [[a]]
interleave ([a] -> [a] -> [[a]]
perms [a]
ts (a
ta -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
is)) ([a] -> [[a]]
forall a. [a] -> [[a]]
permutations [a]
is)
where interleave :: [a] -> [[a]] -> [[a]]
interleave xs :: [a]
xs r :: [[a]]
r = let (_,zs :: [[a]]
zs) = ([a] -> [a]) -> [a] -> [[a]] -> ([a], [[a]])
forall c. ([a] -> c) -> [a] -> [c] -> ([a], [c])
interleave' [a] -> [a]
forall a. a -> a
id [a]
xs [[a]]
r in [[a]]
zs
interleave' :: ([a] -> c) -> [a] -> [c] -> ([a], [c])
interleave' _ [] r :: [c]
r = ([a]
ts, [c]
r)
interleave' f :: [a] -> c
f (y :: a
y:ys :: [a]
ys) r :: [c]
r = let (us :: [a]
us,zs :: [c]
zs) = ([a] -> c) -> [a] -> [c] -> ([a], [c])
interleave' ([a] -> c
f ([a] -> c) -> ([a] -> [a]) -> [a] -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:)) [a]
ys [c]
r
in (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
us, [a] -> c
f (a
ta -> [a] -> [a]
forall a. a -> [a] -> [a]
:a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
us) c -> [c] -> [c]
forall a. a -> [a] -> [a]
: [c]
zs)
sort :: (Ord a) => [a] -> [a]
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
#if defined(USE_REPORT_PRELUDE)
sort = sortBy compare
sortBy cmp = foldr (insertBy cmp) []
#else
sort :: [a] -> [a]
sort = (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy cmp :: a -> a -> Ordering
cmp = [[a]] -> [a]
mergeAll ([[a]] -> [a]) -> ([a] -> [[a]]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [[a]]
sequences
where
sequences :: [a] -> [[a]]
sequences (a :: a
a:b :: a
b:xs :: [a]
xs)
| a
a a -> a -> Ordering
`cmp` a
b Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = a -> [a] -> [a] -> [[a]]
descending a
b [a
a] [a]
xs
| Bool
otherwise = a -> ([a] -> [a]) -> [a] -> [[a]]
ascending a
b (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:) [a]
xs
sequences xs :: [a]
xs = [[a]
xs]
descending :: a -> [a] -> [a] -> [[a]]
descending a :: a
a as :: [a]
as (b :: a
b:bs :: [a]
bs)
| a
a a -> a -> Ordering
`cmp` a
b Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = a -> [a] -> [a] -> [[a]]
descending a
b (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as) [a]
bs
descending a :: a
a as :: [a]
as bs :: [a]
bs = (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as)[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
sequences [a]
bs
ascending :: a -> ([a] -> [a]) -> [a] -> [[a]]
ascending a :: a
a as :: [a] -> [a]
as (b :: a
b:bs :: [a]
bs)
| a
a a -> a -> Ordering
`cmp` a
b Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
/= Ordering
GT = a -> ([a] -> [a]) -> [a] -> [[a]]
ascending a
b (\ys :: [a]
ys -> [a] -> [a]
as (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)) [a]
bs
ascending a :: a
a as :: [a] -> [a]
as bs :: [a]
bs = let !x :: [a]
x = [a] -> [a]
as [a
a]
in [a]
x [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
sequences [a]
bs
mergeAll :: [[a]] -> [a]
mergeAll [x :: [a]
x] = [a]
x
mergeAll xs :: [[a]]
xs = [[a]] -> [a]
mergeAll ([[a]] -> [[a]]
mergePairs [[a]]
xs)
mergePairs :: [[a]] -> [[a]]
mergePairs (a :: [a]
a:b :: [a]
b:xs :: [[a]]
xs) = let !x :: [a]
x = [a] -> [a] -> [a]
merge [a]
a [a]
b
in [a]
x [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [[a]] -> [[a]]
mergePairs [[a]]
xs
mergePairs xs :: [[a]]
xs = [[a]]
xs
merge :: [a] -> [a] -> [a]
merge as :: [a]
as@(a :: a
a:as' :: [a]
as') bs :: [a]
bs@(b :: a
b:bs' :: [a]
bs')
| a
a a -> a -> Ordering
`cmp` a
b Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT = a
ba -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a] -> [a] -> [a]
merge [a]
as [a]
bs'
| Bool
otherwise = a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a] -> [a] -> [a]
merge [a]
as' [a]
bs
merge [] bs :: [a]
bs = [a]
bs
merge as :: [a]
as [] = [a]
as
#endif /* USE_REPORT_PRELUDE */
sortOn :: Ord b => (a -> b) -> [a] -> [a]
sortOn :: (a -> b) -> [a] -> [a]
sortOn f :: a -> b
f =
((b, a) -> a) -> [(b, a)] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (b, a) -> a
forall a b. (a, b) -> b
snd ([(b, a)] -> [a]) -> ([a] -> [(b, a)]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((b, a) -> (b, a) -> Ordering) -> [(b, a)] -> [(b, a)]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (((b, a) -> b) -> (b, a) -> (b, a) -> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (b, a) -> b
forall a b. (a, b) -> a
fst) ([(b, a)] -> [(b, a)]) -> ([a] -> [(b, a)]) -> [a] -> [(b, a)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> (b, a)) -> [a] -> [(b, a)]
forall a b. (a -> b) -> [a] -> [b]
map (\x :: a
x -> let y :: b
y = a -> b
f a
x in b
y b -> (b, a) -> (b, a)
forall a b. a -> b -> b
`seq` (b
y, a
x))
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
{-# INLINE unfoldr #-}
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
unfoldr f :: b -> Maybe (a, b)
f b0 :: b
b0 = (forall b. (a -> b -> b) -> b -> b) -> [a]
forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
build (\c :: a -> b -> b
c n :: b
n ->
let go :: b -> b
go b :: b
b = case b -> Maybe (a, b)
f b
b of
Just (a :: a
a, new_b :: b
new_b) -> a
a a -> b -> b
`c` b -> b
go b
new_b
Nothing -> b
n
in b -> b
go b
b0)
lines :: String -> [String]
lines :: [Char] -> [[Char]]
lines "" = []
lines s :: [Char]
s = ([Char], [[Char]]) -> [[Char]]
forall a. (a, [a]) -> [a]
cons (case (Char -> Bool) -> [Char] -> ([Char], [Char])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '\n') [Char]
s of
(l :: [Char]
l, s' :: [Char]
s') -> ([Char]
l, case [Char]
s' of
[] -> []
_:s'' :: [Char]
s'' -> [Char] -> [[Char]]
lines [Char]
s''))
where
cons :: (a, [a]) -> [a]
cons ~(h :: a
h, t :: [a]
t) = a
h a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
t
unlines :: [String] -> String
#if defined(USE_REPORT_PRELUDE)
unlines = concatMap (++ "\n")
#else
unlines :: [[Char]] -> [Char]
unlines [] = []
unlines (l :: [Char]
l:ls :: [[Char]]
ls) = [Char]
l [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ '\n' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [[Char]] -> [Char]
unlines [[Char]]
ls
#endif
words :: String -> [String]
{-# NOINLINE [1] words #-}
words :: [Char] -> [[Char]]
words s :: [Char]
s = case (Char -> Bool) -> [Char] -> [Char]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace [Char]
s of
"" -> []
s' :: [Char]
s' -> [Char]
w [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char] -> [[Char]]
words [Char]
s''
where (w :: [Char]
w, s'' :: [Char]
s'') =
(Char -> Bool) -> [Char] -> ([Char], [Char])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break Char -> Bool
isSpace [Char]
s'
{-# RULES
"words" [~1] forall s . words s = build (\c n -> wordsFB c n s)
"wordsList" [1] wordsFB (:) [] = words
#-}
wordsFB :: ([Char] -> b -> b) -> b -> String -> b
{-# INLINE [0] wordsFB #-}
wordsFB :: ([Char] -> b -> b) -> b -> [Char] -> b
wordsFB c :: [Char] -> b -> b
c n :: b
n = [Char] -> b
go
where
go :: [Char] -> b
go s :: [Char]
s = case (Char -> Bool) -> [Char] -> [Char]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace [Char]
s of
"" -> b
n
s' :: [Char]
s' -> [Char]
w [Char] -> b -> b
`c` [Char] -> b
go [Char]
s''
where (w :: [Char]
w, s'' :: [Char]
s'') = (Char -> Bool) -> [Char] -> ([Char], [Char])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break Char -> Bool
isSpace [Char]
s'
unwords :: [String] -> String
#if defined(USE_REPORT_PRELUDE)
unwords [] = ""
unwords ws = foldr1 (\w s -> w ++ ' ':s) ws
#else
{-# NOINLINE [1] unwords #-}
unwords :: [[Char]] -> [Char]
unwords [] = ""
unwords (w :: [Char]
w:ws :: [[Char]]
ws) = [Char]
w [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
go [[Char]]
ws
where
go :: [[Char]] -> [Char]
go [] = ""
go (v :: [Char]
v:vs :: [[Char]]
vs) = ' ' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: ([Char]
v [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
go [[Char]]
vs)
{-# RULES
"unwords" [~1] forall ws .
unwords ws = tailUnwords (foldr unwordsFB "" ws)
"unwordsList" [1] forall ws .
tailUnwords (foldr unwordsFB "" ws) = unwords ws
#-}
{-# INLINE [0] tailUnwords #-}
tailUnwords :: String -> String
tailUnwords :: [Char] -> [Char]
tailUnwords [] = []
tailUnwords (_:xs :: [Char]
xs) = [Char]
xs
{-# INLINE [0] unwordsFB #-}
unwordsFB :: String -> String -> String
unwordsFB :: [Char] -> [Char] -> [Char]
unwordsFB w :: [Char]
w r :: [Char]
r = ' ' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: [Char]
w [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
r
#endif
data SnocBuilder a = SnocBuilder {-# UNPACK #-} !Word [a] [a]
{-# INLINE sb #-}
sb :: Word -> [a] -> [a] -> SnocBuilder a
sb :: Word -> [a] -> [a] -> SnocBuilder a
sb lp :: Word
lp f :: [a]
f r :: [a]
r
| Word
lp Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< 255 Bool -> Bool -> Bool
|| (Word
lp Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. (Word
lp Word -> Word -> Word
forall a. Num a => a -> a -> a
+ 1)) Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
/= 0 = Word -> [a] -> [a] -> SnocBuilder a
forall a. Word -> [a] -> [a] -> SnocBuilder a
SnocBuilder Word
lp [a]
f [a]
r
| Bool
otherwise = Word -> [a] -> [a] -> SnocBuilder a
forall a. Word -> [a] -> [a] -> SnocBuilder a
SnocBuilder Word
lp ([a]
f [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
r) []
emptySB :: SnocBuilder a
emptySB :: SnocBuilder a
emptySB = Word -> [a] -> [a] -> SnocBuilder a
forall a. Word -> [a] -> [a] -> SnocBuilder a
SnocBuilder 0 [] []
snocSB :: SnocBuilder a -> a -> SnocBuilder a
snocSB :: SnocBuilder a -> a -> SnocBuilder a
snocSB (SnocBuilder lp :: Word
lp f :: [a]
f r :: [a]
r) x :: a
x = Word -> [a] -> [a] -> SnocBuilder a
forall a. Word -> [a] -> [a] -> SnocBuilder a
sb (Word
lp Word -> Word -> Word
forall a. Num a => a -> a -> a
+ 1) [a]
f (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
r)
toListSB :: SnocBuilder a -> [a]
toListSB :: SnocBuilder a -> [a]
toListSB (SnocBuilder _ f :: [a]
f r :: [a]
r) = [a]
f [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
r