{-# LANGUAGE CPP #-}
module Data.List.Ordered
(
member, memberBy, has, hasBy
, subset, subsetBy
, isSorted, isSortedBy
, insertBag, insertBagBy
, insertSet, insertSetBy
, isect, isectBy
, union, unionBy
, minus, minusBy
, minus', minusBy'
, xunion, xunionBy
, merge, mergeBy
, mergeAll, mergeAllBy
, unionAll, unionAllBy
, nub, nubBy
, sort, sortBy
, sortOn, sortOn'
, nubSort, nubSortBy
, nubSortOn, nubSortOn'
, foldt, foldt'
) where
import Data.List(sort,sortBy,intersect)
#if MIN_VERSION_base(4,7,1)
import Data.List(sortOn)
#endif
isSorted :: Ord a => [a] -> Bool
isSorted :: forall a. Ord a => [a] -> Bool
isSorted = (a -> a -> Bool) -> [a] -> Bool
forall a. (a -> a -> Bool) -> [a] -> Bool
isSortedBy a -> a -> Bool
forall a. Ord a => a -> a -> Bool
(<=)
isSortedBy :: (a -> a -> Bool) -> [a] -> Bool
isSortedBy :: forall a. (a -> a -> Bool) -> [a] -> Bool
isSortedBy a -> a -> Bool
lte = [a] -> Bool
loop
where
loop :: [a] -> Bool
loop [] = Bool
True
loop [a
_] = Bool
True
loop (a
x:a
y:[a]
zs) = (a
x a -> a -> Bool
`lte` a
y) Bool -> Bool -> Bool
&& [a] -> Bool
loop (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
zs)
member :: Ord a => a -> [a] -> Bool
member :: forall a. Ord a => a -> [a] -> Bool
member = (a -> a -> Ordering) -> a -> [a] -> Bool
forall a. (a -> a -> Ordering) -> a -> [a] -> Bool
memberBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
memberBy :: (a -> a -> Ordering) -> a -> [a] -> Bool
memberBy :: forall a. (a -> a -> Ordering) -> a -> [a] -> Bool
memberBy a -> a -> Ordering
cmp a
x = [a] -> Bool
loop
where
loop :: [a] -> Bool
loop [] = Bool
False
loop (a
y:[a]
ys) = case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> Bool
False
Ordering
EQ -> Bool
True
Ordering
GT -> [a] -> Bool
loop [a]
ys
has :: Ord a => [a] -> a -> Bool
has :: forall a. Ord a => [a] -> a -> Bool
has [a]
xs a
y = (a -> a -> Ordering) -> a -> [a] -> Bool
forall a. (a -> a -> Ordering) -> a -> [a] -> Bool
memberBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare a
y [a]
xs
hasBy :: (a -> a -> Ordering) -> [a] -> a -> Bool
hasBy :: forall a. (a -> a -> Ordering) -> [a] -> a -> Bool
hasBy a -> a -> Ordering
cmp [a]
xs a
y = (a -> a -> Ordering) -> a -> [a] -> Bool
forall a. (a -> a -> Ordering) -> a -> [a] -> Bool
memberBy a -> a -> Ordering
cmp a
y [a]
xs
insertBag :: Ord a => a -> [a] -> [a]
insertBag :: forall a. Ord a => a -> [a] -> [a]
insertBag = (a -> a -> Ordering) -> a -> [a] -> [a]
forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertBagBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
insertBagBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBagBy :: forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertBagBy a -> a -> Ordering
cmp = a -> [a] -> [a]
loop
where
loop :: a -> [a] -> [a]
loop a
x [] = [a
x]
loop a
x (a
y:[a]
ys)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:a -> [a] -> [a]
loop a
x [a]
ys
Ordering
_ -> a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys
insertSet :: Ord a => a -> [a] -> [a]
insertSet :: forall a. Ord a => a -> [a] -> [a]
insertSet = (a -> a -> Ordering) -> a -> [a] -> [a]
forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertSetBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
insertSetBy :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertSetBy :: forall a. (a -> a -> Ordering) -> a -> [a] -> [a]
insertSetBy a -> a -> Ordering
cmp = a -> [a] -> [a]
loop
where
loop :: a -> [a] -> [a]
loop a
x [] = [a
x]
loop a
x (a
y:[a]
ys) = case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys
Ordering
EQ -> a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys
Ordering
GT -> a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:a -> [a] -> [a]
loop a
x [a]
ys
isect :: Ord a => [a] -> [a] -> [a]
isect :: forall a. Ord a => [a] -> [a] -> [a]
isect = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
isectBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
isectBy :: (a -> b -> Ordering) -> [a] -> [b] -> [a]
isectBy :: forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
isectBy a -> b -> Ordering
cmp = [a] -> [b] -> [a]
loop
where
loop :: [a] -> [b] -> [a]
loop [] [b]
_ys = []
loop [a]
_xs [] = []
loop (a
x:[a]
xs) (b
y:[b]
ys)
= case a -> b -> Ordering
cmp a
x b
y of
Ordering
LT -> [a] -> [b] -> [a]
loop [a]
xs (b
yb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
ys)
Ordering
EQ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [b] -> [a]
loop [a]
xs [b]
ys
Ordering
GT -> [a] -> [b] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [b]
ys
union :: Ord a => [a] -> [a] -> [a]
union :: forall a. Ord a => [a] -> [a] -> [a]
union = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
unionBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
unionBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
unionBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
unionBy a -> a -> Ordering
cmp = [a] -> [a] -> [a]
loop
where
loop :: [a] -> [a] -> [a]
loop [] [a]
ys = [a]
ys
loop [a]
xs [] = [a]
xs
loop (a
x:[a]
xs) (a
y:[a]
ys)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
Ordering
EQ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop [a]
xs [a]
ys
Ordering
GT -> a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
minus :: Ord a => [a] -> [a] -> [a]
minus :: forall a. Ord a => [a] -> [a] -> [a]
minus = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
minusBy :: (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy :: forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy a -> b -> Ordering
cmp = [a] -> [b] -> [a]
loop
where
loop :: [a] -> [b] -> [a]
loop [] [b]
_ys = []
loop [a]
xs [] = [a]
xs
loop (a
x:[a]
xs) (b
y:[b]
ys)
= case a -> b -> Ordering
cmp a
x b
y of
Ordering
LT -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [b] -> [a]
loop [a]
xs (b
yb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
ys)
Ordering
EQ -> [a] -> [b] -> [a]
loop [a]
xs [b]
ys
Ordering
GT -> [a] -> [b] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [b]
ys
minus' :: Ord a => [a] -> [a] -> [a]
minus' :: forall a. Ord a => [a] -> [a] -> [a]
minus' = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy' a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
minusBy' :: (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy' :: forall a b. (a -> b -> Ordering) -> [a] -> [b] -> [a]
minusBy' a -> b -> Ordering
cmp = [a] -> [b] -> [a]
loop
where
loop :: [a] -> [b] -> [a]
loop [] [b]
_ys = []
loop [a]
xs [] = [a]
xs
loop (a
x:[a]
xs) (b
y:[b]
ys)
= case a -> b -> Ordering
cmp a
x b
y of
Ordering
LT -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [b] -> [a]
loop [a]
xs (b
yb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
ys)
Ordering
EQ -> [a] -> [b] -> [a]
loop [a]
xs (b
yb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
ys)
Ordering
GT -> [a] -> [b] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [b]
ys
xunion :: Ord a => [a] -> [a] -> [a]
xunion :: forall a. Ord a => [a] -> [a] -> [a]
xunion = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
xunionBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
xunionBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
xunionBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
xunionBy a -> a -> Ordering
cmp = [a] -> [a] -> [a]
loop
where
loop :: [a] -> [a] -> [a]
loop [] [a]
ys = [a]
ys
loop [a]
xs [] = [a]
xs
loop (a
x:[a]
xs) (a
y:[a]
ys)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
Ordering
EQ -> [a] -> [a] -> [a]
loop [a]
xs [a]
ys
Ordering
GT -> a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
merge :: Ord a => [a] -> [a] -> [a]
merge :: forall a. Ord a => [a] -> [a] -> [a]
merge = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
mergeBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp = [a] -> [a] -> [a]
loop
where
loop :: [a] -> [a] -> [a]
loop [] [a]
ys = [a]
ys
loop [a]
xs [] = [a]
xs
loop (a
x:[a]
xs) (a
y:[a]
ys)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
Ordering
_ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
loop [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
subset :: Ord a => [a] -> [a] -> Bool
subset :: forall a. Ord a => [a] -> [a] -> Bool
subset = (a -> a -> Ordering) -> [a] -> [a] -> Bool
forall a. (a -> a -> Ordering) -> [a] -> [a] -> Bool
subsetBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
subsetBy :: (a -> a -> Ordering) -> [a] -> [a] -> Bool
subsetBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> Bool
subsetBy a -> a -> Ordering
cmp = [a] -> [a] -> Bool
loop
where
loop :: [a] -> [a] -> Bool
loop [] [a]
_ys = Bool
True
loop [a]
_xs [] = Bool
False
loop (a
x:[a]
xs) (a
y:[a]
ys)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> Bool
False
Ordering
EQ -> [a] -> [a] -> Bool
loop [a]
xs [a]
ys
Ordering
GT -> [a] -> [a] -> Bool
loop (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
#if !MIN_VERSION_base(4,7,1)
sortOn :: Ord b => (a -> b) -> [a] -> [a]
sortOn f = map snd . sortOn' fst . map (\x -> let y = f x in y `seq` (y, x))
#endif
sortOn' :: Ord b => (a -> b) -> [a] -> [a]
sortOn' :: forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn' a -> b
f = (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (\a
x a
y -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (a -> b
f a
x) (a -> b
f a
y))
nubSort :: Ord a => [a] -> [a]
nubSort :: forall a. Ord a => [a] -> [a]
nubSort = (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
nubSortBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
nubSortBy :: (a -> a -> Ordering) -> [a] -> [a]
nubSortBy :: forall a. (a -> a -> Ordering) -> [a] -> [a]
nubSortBy a -> a -> Ordering
cmp = ([a] -> [a] -> [a]) -> [a] -> [[a]] -> [a]
forall a. (a -> a -> a) -> a -> [a] -> a
foldt' ((a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
unionBy a -> a -> Ordering
cmp) [] ([[a]] -> [a]) -> ([a] -> [[a]]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [[a]]
runs
where
runs :: [a] -> [[a]]
runs (a
a:a
b:[a]
xs)
= case a -> a -> Ordering
cmp a
a a
b of
Ordering
LT -> a -> ([a] -> [a]) -> [a] -> [[a]]
asc a
b (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:) [a]
xs
Ordering
EQ -> [a] -> [[a]]
runs (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
Ordering
GT -> a -> [a] -> [a] -> [[a]]
desc a
b [a
a] [a]
xs
runs [a]
xs = [[a]
xs]
desc :: a -> [a] -> [a] -> [[a]]
desc a
a [a]
as [] = [a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as]
desc a
a [a]
as (a
b:[a]
bs)
= case a -> a -> Ordering
cmp a
a a
b of
Ordering
LT -> (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as) [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
runs (a
ba -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
bs)
Ordering
EQ -> a -> [a] -> [a] -> [[a]]
desc a
a [a]
as [a]
bs
Ordering
GT -> a -> [a] -> [a] -> [[a]]
desc a
b (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
as) [a]
bs
asc :: a -> ([a] -> [a]) -> [a] -> [[a]]
asc a
a [a] -> [a]
as [] = [[a] -> [a]
as [a
a]]
asc a
a [a] -> [a]
as (a
b:[a]
bs)
= case a -> a -> Ordering
cmp a
a a
b of
Ordering
LT -> a -> ([a] -> [a]) -> [a] -> [[a]]
asc a
b (\[a]
ys -> [a] -> [a]
as (a
aa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)) [a]
bs
Ordering
EQ -> a -> ([a] -> [a]) -> [a] -> [[a]]
asc a
a [a] -> [a]
as [a]
bs
Ordering
GT -> [a] -> [a]
as [a
a] [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
runs (a
ba -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
bs)
nubSortOn :: Ord b => (a -> b) -> [a] -> [a]
nubSortOn :: forall b a. Ord b => (a -> b) -> [a] -> [a]
nubSortOn 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) -> [(b, a)] -> [(b, a)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
nubSortOn' (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 (\a
x -> let y :: b
y = a -> b
f a
x in b
y b -> (b, a) -> (b, a)
`seq` (b
y, a
x))
nubSortOn' :: Ord b => (a -> b) -> [a] -> [a]
nubSortOn' :: forall b a. Ord b => (a -> b) -> [a] -> [a]
nubSortOn' a -> b
f = (a -> a -> Ordering) -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a]
nubSortBy (\a
x a
y -> b -> b -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (a -> b
f a
x) (a -> b
f a
y))
nub :: Ord a => [a] -> [a]
nub :: forall a. Ord a => [a] -> [a]
nub = (a -> a -> Bool) -> [a] -> [a]
forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy a -> a -> Bool
forall a. Ord a => a -> a -> Bool
(<)
nubBy :: (a -> a -> Bool) -> [a] -> [a]
nubBy :: forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy a -> a -> Bool
p [] = []
nubBy a -> a -> Bool
p (a
x:[a]
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
loop a
x [a]
xs
where
loop :: a -> [a] -> [a]
loop a
_ [] = []
loop a
x (a
y:[a]
ys)
| a -> a -> Bool
p a
x a
y = a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
loop a
y [a]
ys
| Bool
otherwise = a -> [a] -> [a]
loop a
x [a]
ys
foldt' :: (a -> a -> a) -> a -> [a] -> a
foldt' :: forall a. (a -> a -> a) -> a -> [a] -> a
foldt' a -> a -> a
plus a
zero [a]
xs
= case [a]
xs of
[] -> a
zero
(a
_:[a]
_) -> [a] -> a
loop [a]
xs
where
loop :: [a] -> a
loop [a
x] = a
x
loop [a]
xs = [a] -> a
loop ([a] -> [a]
pairs [a]
xs)
pairs :: [a] -> [a]
pairs (a
x:a
y:[a]
zs) = a -> a -> a
plus a
x a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a]
pairs [a]
zs
pairs [a]
zs = [a]
zs
foldt :: (a -> a -> a) -> a -> [a] -> a
foldt :: forall a. (a -> a -> a) -> a -> [a] -> a
foldt a -> a -> a
plus a
zero = [a] -> a
loop
where
loop :: [a] -> a
loop [] = a
zero
loop (a
x:[a]
xs) = a
x a -> a -> a
`plus` [a] -> a
loop ([a] -> [a]
pairs [a]
xs)
pairs :: [a] -> [a]
pairs (a
x:a
y:[a]
zs) = a -> a -> a
plus a
x a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a]
pairs [a]
zs
pairs [a]
zs = [a]
zs
data People a = VIP a (People a) | Crowd [a]
serve :: People a -> [a]
serve (VIP a
x People a
xs) = a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:People a -> [a]
serve People a
xs
serve (Crowd [a]
xs) = [a]
xs
vips :: [[a]] -> [People a]
vips [[a]]
xss = [ a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x ([a] -> People a
forall a. [a] -> People a
Crowd [a]
xs) | (a
x:[a]
xs) <- [[a]]
xss ]
mergeAll :: Ord a => [[a]] -> [a]
mergeAll :: forall a. Ord a => [[a]] -> [a]
mergeAll = (a -> a -> Ordering) -> [[a]] -> [a]
forall a. (a -> a -> Ordering) -> [[a]] -> [a]
mergeAllBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
mergeAllBy :: (a -> a -> Ordering) -> [[a]] -> [a]
mergeAllBy :: forall a. (a -> a -> Ordering) -> [[a]] -> [a]
mergeAllBy a -> a -> Ordering
cmp = People a -> [a]
forall {a}. People a -> [a]
serve (People a -> [a]) -> ([[a]] -> People a) -> [[a]] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (People a -> People a -> People a)
-> People a -> [People a] -> People a
forall a. (a -> a -> a) -> a -> [a] -> a
foldt People a -> People a -> People a
merge' ([a] -> People a
forall a. [a] -> People a
Crowd []) ([People a] -> People a)
-> ([[a]] -> [People a]) -> [[a]] -> People a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[a]] -> [People a]
forall {a}. [[a]] -> [People a]
vips
where
merge' :: People a -> People a -> People a
merge' (VIP a
x People a
xs) People a
ys = a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x (People a -> People a -> People a
merge' People a
xs People a
ys)
merge' (Crowd []) People a
ys = People a
ys
merge' (Crowd [a]
xs) (Crowd [a]
ys) = [a] -> People a
forall a. [a] -> People a
Crowd ((a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp [a]
xs [a]
ys)
merge' xs :: People a
xs@(Crowd (a
x:[a]
xt)) ys :: People a
ys@(VIP a
y People a
yt)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
GT -> a -> People a -> People a
forall a. a -> People a -> People a
VIP a
y (People a -> People a -> People a
merge' People a
xs People a
yt)
Ordering
_ -> a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x (People a -> People a -> People a
merge' ([a] -> People a
forall a. [a] -> People a
Crowd [a]
xt) People a
ys)
unionAll :: Ord a => [[a]] -> [a]
unionAll :: forall a. Ord a => [[a]] -> [a]
unionAll = (a -> a -> Ordering) -> [[a]] -> [a]
forall a. (a -> a -> Ordering) -> [[a]] -> [a]
unionAllBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare
unionAllBy :: (a -> a -> Ordering) -> [[a]] -> [a]
unionAllBy :: forall a. (a -> a -> Ordering) -> [[a]] -> [a]
unionAllBy a -> a -> Ordering
cmp = People a -> [a]
forall {a}. People a -> [a]
serve (People a -> [a]) -> ([[a]] -> People a) -> [[a]] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (People a -> People a -> People a)
-> People a -> [People a] -> People a
forall a. (a -> a -> a) -> a -> [a] -> a
foldt People a -> People a -> People a
union' ([a] -> People a
forall a. [a] -> People a
Crowd []) ([People a] -> People a)
-> ([[a]] -> [People a]) -> [[a]] -> People a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[a]] -> [People a]
forall {a}. [[a]] -> [People a]
vips
where
msg :: String
msg = String
"Data.List.Ordered.unionAllBy: the heads of the lists are not sorted"
union' :: People a -> People a -> People a
union' (VIP a
x People a
xs) People a
ys
= a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x (People a -> People a) -> People a -> People a
forall a b. (a -> b) -> a -> b
$ case People a
ys of
Crowd [a]
_ -> People a -> People a -> People a
union' People a
xs People a
ys
VIP a
y People a
yt -> case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> People a -> People a -> People a
union' People a
xs People a
ys
Ordering
EQ -> People a -> People a -> People a
union' People a
xs People a
yt
Ordering
GT -> String -> People a
forall a. HasCallStack => String -> a
error String
msg
union' (Crowd []) People a
ys = People a
ys
union' (Crowd [a]
xs) (Crowd [a]
ys) = [a] -> People a
forall a. [a] -> People a
Crowd ((a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
unionBy a -> a -> Ordering
cmp [a]
xs [a]
ys)
union' xs :: People a
xs@(Crowd (a
x:[a]
xt)) ys :: People a
ys@(VIP a
y People a
yt)
= case a -> a -> Ordering
cmp a
x a
y of
Ordering
LT -> a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x (People a -> People a -> People a
union' ([a] -> People a
forall a. [a] -> People a
Crowd [a]
xt) People a
ys)
Ordering
EQ -> a -> People a -> People a
forall a. a -> People a -> People a
VIP a
x (People a -> People a -> People a
union' ([a] -> People a
forall a. [a] -> People a
Crowd [a]
xt) People a
yt)
Ordering
GT -> a -> People a -> People a
forall a. a -> People a -> People a
VIP a
y (People a -> People a -> People a
union' People a
xs People a
yt)