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 = forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr 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 = forall a. (a -> a -> Bool) -> a -> [a] -> [a]
insertBy forall a b. (a -> b) -> a -> b
$ forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
Function.on forall a. Eq a => a -> a -> Bool
(==) 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 forall a. a -> [a] -> [a]
: [a]
t
    | Bool
otherwise -> a
h forall a. a -> [a] -> [a]
: forall a. (a -> a -> Bool) -> a -> [a] -> [a]
insertBy a -> a -> Bool
p a
x [a]
t