module Erebos.Util where

uniq :: Eq a => [a] -> [a]
uniq :: forall a. Eq a => [a] -> [a]
uniq (a
x:a
y:[a]
xs) | a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y    = [a] -> [a]
forall a. Eq a => [a] -> [a]
uniq (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
              | Bool
otherwise = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a]
forall a. Eq a => [a] -> [a]
uniq (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
uniq [a]
xs = [a]
xs

mergeBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp (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 -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp [a]
xs (a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys)
                                     Ordering
EQ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp [a]
xs [a]
ys
                                     Ordering
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]
mergeBy a -> a -> Ordering
cmp (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs) [a]
ys
mergeBy a -> a -> Ordering
_ [a]
xs [] = [a]
xs
mergeBy a -> a -> Ordering
_ [] [a]
ys = [a]
ys

mergeUniqBy :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeUniqBy :: forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeUniqBy a -> a -> Ordering
cmp (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 -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp [a]
xs (a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ys)
                                         Ordering
EQ -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeBy a -> a -> Ordering
cmp [a]
xs [a]
ys
                                         Ordering
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]
mergeBy a -> a -> Ordering
cmp (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs) [a]
ys
mergeUniqBy a -> a -> Ordering
_ [a]
xs [] = [a]
xs
mergeUniqBy a -> a -> Ordering
_ [] [a]
ys = [a]
ys

mergeUniq :: Ord a => [a] -> [a] -> [a]
mergeUniq :: forall a. Ord a => [a] -> [a] -> [a]
mergeUniq = (a -> a -> Ordering) -> [a] -> [a] -> [a]
forall a. (a -> a -> Ordering) -> [a] -> [a] -> [a]
mergeUniqBy a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare

diffSorted :: Ord a => [a] -> [a] -> [a]
diffSorted :: forall a. Ord a => [a] -> [a] -> [a]
diffSorted (a
x:[a]
xs) (a
y:[a]
ys) | a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y     = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
forall a. Ord a => [a] -> [a] -> [a]
diffSorted [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
                         | a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y     = [a] -> [a] -> [a]
forall a. Ord a => [a] -> [a] -> [a]
diffSorted (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
                         | Bool
otherwise = [a] -> [a] -> [a]
forall a. Ord a => [a] -> [a] -> [a]
diffSorted [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
diffSorted [a]
xs [a]
_ = [a]
xs

intersectsSorted :: Ord a => [a] -> [a] -> Bool
intersectsSorted :: forall a. Ord a => [a] -> [a] -> Bool
intersectsSorted (a
x:[a]
xs) (a
y:[a]
ys) | a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
y     = [a] -> [a] -> Bool
forall a. Ord a => [a] -> [a] -> Bool
intersectsSorted [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
                               | a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y     = [a] -> [a] -> Bool
forall a. Ord a => [a] -> [a] -> Bool
intersectsSorted (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
                               | Bool
otherwise = Bool
True
intersectsSorted [a]
_ [a]
_ = Bool
False