module Patrol.Extra.List where

import qualified Data.Function as Function

insertAll :: (Eq k) => [(k, v)] -> [(k, v)] -> [(k, v)]
insertAll :: forall k v. Eq k => [(k, v)] -> [(k, v)] -> [(k, v)]
insertAll = ([(k, v)] -> [(k, v)] -> [(k, v)])
-> [(k, v)] -> [(k, v)] -> [(k, v)]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (([(k, v)] -> [(k, v)] -> [(k, v)])
 -> [(k, v)] -> [(k, v)] -> [(k, v)])
-> ([(k, v)] -> [(k, v)] -> [(k, v)])
-> [(k, v)]
-> [(k, v)]
-> [(k, v)]
forall a b. (a -> b) -> a -> b
$ ((k, v) -> [(k, v)] -> [(k, v)])
-> [(k, v)] -> [(k, v)] -> [(k, v)]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (k, v) -> [(k, v)] -> [(k, v)]
forall k v. Eq k => (k, v) -> [(k, v)] -> [(k, v)]
insert

insert :: (Eq k) => (k, v) -> [(k, v)] -> [(k, v)]
insert :: forall k v. Eq k => (k, v) -> [(k, v)] -> [(k, v)]
insert = ((k, v) -> (k, v) -> Bool) -> (k, v) -> [(k, v)] -> [(k, v)]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
insertBy (((k, v) -> (k, v) -> Bool) -> (k, v) -> [(k, v)] -> [(k, v)])
-> ((k, v) -> (k, v) -> Bool) -> (k, v) -> [(k, v)] -> [(k, v)]
forall a b. (a -> b) -> a -> b
$ (k -> k -> Bool) -> ((k, v) -> k) -> (k, v) -> (k, v) -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
Function.on k -> k -> Bool
forall a. Eq a => a -> a -> Bool
(==) (k, v) -> k
forall a b. (a, b) -> a
fst

insertBy :: (a -> a -> Bool) -> a -> [a] -> [a]
insertBy :: forall a. (a -> a -> Bool) -> a -> [a] -> [a]
insertBy a -> a -> Bool
p a
x [a]
xs = case [a]
xs of
  [] -> [a
x]
  a
h : [a]
t
    | a -> a -> Bool
p a
x a
h -> a
h a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
t
    | Bool
otherwise -> a
h a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a -> Bool) -> a -> [a] -> [a]
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
insertBy a -> a -> Bool
p a
x [a]
t