module Agda.Utils.AssocList
( module Agda.Utils.AssocList
, lookup
) where
import Prelude hiding (lookup)
import Data.Function
import Data.List (lookup)
import qualified Data.List as List
import qualified Data.Map as Map
import Agda.Utils.Tuple
import Agda.Utils.Impossible
type AssocList k v = [(k,v)]
apply :: Ord k => AssocList k v -> k -> Maybe v
apply :: AssocList k v -> k -> Maybe v
apply AssocList k v
m = (k -> Map k v -> Maybe v
forall k a. Ord k => k -> Map k a -> Maybe a
`Map.lookup` (v -> v -> v) -> AssocList k v -> Map k v
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith (\ v
_new v
old -> v
old) AssocList k v
m)
keys :: AssocList k v -> [k]
keys :: AssocList k v -> [k]
keys = ((k, v) -> k) -> AssocList k v -> [k]
forall a b. (a -> b) -> [a] -> [b]
map (k, v) -> k
forall a b. (a, b) -> a
fst
insert :: k -> v -> AssocList k v -> AssocList k v
insert :: k -> v -> AssocList k v -> AssocList k v
insert k
k v
v = ((k
k,v
v) (k, v) -> AssocList k v -> AssocList k v
forall a. a -> [a] -> [a]
:)
update :: Eq k => k -> v -> AssocList k v -> AssocList k v
update :: k -> v -> AssocList k v -> AssocList k v
update k
k v
v = k -> (v -> v) -> AssocList k v -> AssocList k v
forall k v. Eq k => k -> (v -> v) -> AssocList k v -> AssocList k v
updateAt k
k ((v -> v) -> AssocList k v -> AssocList k v)
-> (v -> v) -> AssocList k v -> AssocList k v
forall a b. (a -> b) -> a -> b
$ v -> v -> v
forall a b. a -> b -> a
const v
v
delete :: Eq k => k -> AssocList k v -> AssocList k v
delete :: k -> AssocList k v -> AssocList k v
delete k
k = ((k, v) -> (k, v) -> Bool)
-> (k, v) -> AssocList k v -> AssocList k v
forall a. (a -> a -> Bool) -> a -> [a] -> [a]
List.deleteBy (k -> k -> Bool
forall a. Eq a => a -> a -> Bool
(==) (k -> k -> Bool) -> ((k, v) -> k) -> (k, v) -> (k, v) -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (k, v) -> k
forall a b. (a, b) -> a
fst) (k
k, v
forall a. HasCallStack => a
__IMPOSSIBLE__)
updateAt :: Eq k => k -> (v -> v) -> AssocList k v -> AssocList k v
updateAt :: k -> (v -> v) -> AssocList k v -> AssocList k v
updateAt k
k v -> v
f = AssocList k v -> AssocList k v
loop where
loop :: AssocList k v -> AssocList k v
loop [] = AssocList k v
forall a. HasCallStack => a
__IMPOSSIBLE__
loop (p :: (k, v)
p@(k
k',v
v) : AssocList k v
ps)
| k
k k -> k -> Bool
forall a. Eq a => a -> a -> Bool
== k
k' = (k
k, v -> v
f v
v) (k, v) -> AssocList k v -> AssocList k v
forall a. a -> [a] -> [a]
: AssocList k v
ps
| Bool
otherwise = (k, v)
p (k, v) -> AssocList k v -> AssocList k v
forall a. a -> [a] -> [a]
: AssocList k v -> AssocList k v
loop AssocList k v
ps
mapWithKey :: (k -> v -> v) -> AssocList k v -> AssocList k v
mapWithKey :: (k -> v -> v) -> AssocList k v -> AssocList k v
mapWithKey k -> v -> v
f = ((k, v) -> (k, v)) -> AssocList k v -> AssocList k v
forall a b. (a -> b) -> [a] -> [b]
map (((k, v) -> (k, v)) -> AssocList k v -> AssocList k v)
-> ((k, v) -> (k, v)) -> AssocList k v -> AssocList k v
forall a b. (a -> b) -> a -> b
$ \ (k
k,v
v) -> (k
k, k -> v -> v
f k
k v
v)
mapWithKeyM :: Applicative m => (k -> v -> m v) -> AssocList k v -> m (AssocList k v)
mapWithKeyM :: (k -> v -> m v) -> AssocList k v -> m (AssocList k v)
mapWithKeyM k -> v -> m v
f = ((k, v) -> m (k, v)) -> AssocList k v -> m (AssocList k v)
forall (f :: * -> *) t a.
Applicative f =>
(t -> f a) -> [t] -> f [a]
mapM (((k, v) -> m (k, v)) -> AssocList k v -> m (AssocList k v))
-> ((k, v) -> m (k, v)) -> AssocList k v -> m (AssocList k v)
forall a b. (a -> b) -> a -> b
$ \ (k
k,v
v) -> (k
k,) (v -> (k, v)) -> m v -> m (k, v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> k -> v -> m v
f k
k v
v
where
mapM :: (t -> f a) -> [t] -> f [a]
mapM t -> f a
g [] = [a] -> f [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
mapM t -> f a
g (t
x : [t]
xs) = (:) (a -> [a] -> [a]) -> f a -> f ([a] -> [a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t -> f a
g t
x f ([a] -> [a]) -> f [a] -> f [a]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (t -> f a) -> [t] -> f [a]
mapM t -> f a
g [t]
xs
mapKeysMonotonic :: (k -> k') -> AssocList k v -> AssocList k' v
mapKeysMonotonic :: (k -> k') -> AssocList k v -> AssocList k' v
mapKeysMonotonic k -> k'
f = ((k, v) -> (k', v)) -> AssocList k v -> AssocList k' v
forall a b. (a -> b) -> [a] -> [b]
map (((k, v) -> (k', v)) -> AssocList k v -> AssocList k' v)
-> ((k, v) -> (k', v)) -> AssocList k v -> AssocList k' v
forall a b. (a -> b) -> a -> b
$ (k -> k') -> (k, v) -> (k', v)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst k -> k'
f