{-# LANGUAGE Safe #-}
module Data.List
(List,
(++),
head,
last,
tail,
init,
uncons,
unsnoc,
singleton,
null,
length,
compareLength,
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,
inits1,
tails,
tails1,
isPrefixOf,
isSuffixOf,
isInfixOf,
isSubsequenceOf,
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,
nubOrd,
delete,
(\\),
union,
intersect,
sort,
sortOn,
insert,
nubBy,
nubOrdBy,
deleteBy,
deleteFirstsBy,
unionBy,
intersectBy,
groupBy,
sortBy,
insertBy,
maximumBy,
minimumBy,
genericLength,
genericTake,
genericDrop,
genericSplitAt,
genericIndex,
genericReplicate
) where
import GHC.Internal.Data.Bool (otherwise)
import GHC.Internal.Data.Function (const)
import GHC.Internal.Data.List
import GHC.Internal.Data.List.NonEmpty (NonEmpty(..))
import GHC.Internal.Data.Ord (Ord, compare, Ordering(..), (<), (>))
import GHC.Internal.Int (Int)
import GHC.Internal.Num ((-))
import GHC.List (build)
import qualified Data.List.NubOrdSet as NubOrdSet
inits1, tails1 :: [a] -> [NonEmpty a]
inits1 :: forall a. [a] -> [NonEmpty a]
inits1 [] = []
inits1 (a
x : [a]
xs) = ([a] -> NonEmpty a) -> [[a]] -> [NonEmpty a]
forall a b. (a -> b) -> [a] -> [b]
map (a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:|) ([a] -> [[a]]
forall a. [a] -> [[a]]
inits [a]
xs)
{-# INLINABLE tails1 #-}
tails1 :: forall a. [a] -> [NonEmpty a]
tails1 [a]
lst = (forall b. (NonEmpty a -> b -> b) -> b -> b) -> [NonEmpty a]
forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
build (\NonEmpty a -> b -> b
c b
n ->
let tails1Go :: [a] -> b
tails1Go [] = b
n
tails1Go (a
x : [a]
xs) = (a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| [a]
xs) NonEmpty a -> b -> b
`c` [a] -> b
tails1Go [a]
xs
in [a] -> b
tails1Go [a]
lst)
compareLength :: [a] -> Int -> Ordering
compareLength :: forall a. [a] -> Int -> Ordering
compareLength [a]
xs Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = Ordering
GT
| Bool
otherwise = (a -> (Int -> Ordering) -> Int -> Ordering)
-> (Int -> Ordering) -> [a] -> Int -> Ordering
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
(\a
_ Int -> Ordering
f Int
m -> if Int
m Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 then Int -> Ordering
f (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) else Ordering
GT)
(\Int
m -> if Int
m Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 then Ordering
LT else Ordering
EQ)
[a]
xs
Int
n
nubOrd :: Ord a => [a] -> [a]
nubOrd :: forall a. Ord a => [a] -> [a]
nubOrd = (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
nubOrdBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
{-# INLINE nubOrd #-}
nubOrdBy :: (a -> a -> Ordering) -> [a] -> [a]
nubOrdBy :: forall a. (a -> a -> Ordering) -> [a] -> [a]
nubOrdBy a -> a -> Ordering
cmp [a]
xs = (a -> (NubOrdSet a -> [a]) -> NubOrdSet a -> [a])
-> (NubOrdSet a -> [a]) -> [a] -> NubOrdSet a -> [a]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
(\a
x NubOrdSet a -> [a]
cont NubOrdSet a
seen -> if (a -> a -> Ordering) -> a -> NubOrdSet a -> Bool
forall a. (a -> a -> Ordering) -> a -> NubOrdSet a -> Bool
NubOrdSet.member a -> a -> Ordering
cmp a
x NubOrdSet a
seen then NubOrdSet a -> [a]
cont NubOrdSet a
seen else a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: NubOrdSet a -> [a]
cont ((a -> a -> Ordering) -> a -> NubOrdSet a -> NubOrdSet a
forall a. (a -> a -> Ordering) -> a -> NubOrdSet a -> NubOrdSet a
NubOrdSet.insert a -> a -> Ordering
cmp a
x NubOrdSet a
seen))
([a] -> NubOrdSet a -> [a]
forall a b. a -> b -> a
const [])
[a]
xs
NubOrdSet a
forall a. NubOrdSet a
NubOrdSet.empty
{-# INLINE nubOrdBy #-}