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 :: forall k v. Ord k => 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 :: forall k v. AssocList k v -> [k]
keys = ((k, v) -> k) -> [(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 :: forall k v. k -> v -> AssocList k v -> AssocList k v
insert k
k v
v = ((k
k,v
v) (k, v) -> [(k, v)] -> [(k, v)]
forall a. a -> [a] -> [a]
:)
update :: Eq k => k -> v -> AssocList k v -> AssocList k v
update :: forall k v. Eq k => 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 :: forall k v. Eq k => k -> AssocList k v -> AssocList k v
delete k
k = ((k, v) -> (k, v) -> Bool) -> (k, v) -> [(k, v)] -> [(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 :: forall k v. Eq k => k -> (v -> v) -> AssocList k v -> AssocList k v
updateAt k
k v -> v
f = [(k, v)] -> [(k, v)]
loop where
loop :: [(k, v)] -> [(k, v)]
loop [] = [(k, v)]
forall a. HasCallStack => a
__IMPOSSIBLE__
loop (p :: (k, v)
p@(k
k',v
v) : [(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) -> [(k, v)] -> [(k, v)]
forall a. a -> [a] -> [a]
: [(k, v)]
ps
| Bool
otherwise = (k, v)
p (k, v) -> [(k, v)] -> [(k, v)]
forall a. a -> [a] -> [a]
: [(k, v)] -> [(k, v)]
loop [(k, v)]
ps
mapWithKey :: (k -> v -> v) -> AssocList k v -> AssocList k v
mapWithKey :: forall k v. (k -> v -> v) -> AssocList k v -> AssocList k v
mapWithKey k -> v -> v
f = ((k, v) -> (k, v)) -> [(k, v)] -> [(k, v)]
forall a b. (a -> b) -> [a] -> [b]
map (((k, v) -> (k, v)) -> [(k, v)] -> [(k, v)])
-> ((k, v) -> (k, v)) -> [(k, v)] -> [(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 :: forall (m :: * -> *) k v.
Applicative m =>
(k -> v -> m v) -> AssocList k v -> m (AssocList k v)
mapWithKeyM k -> v -> m v
f = ((k, v) -> m (k, v)) -> [(k, v)] -> m [(k, v)]
forall {f :: * -> *} {t} {a}.
Applicative f =>
(t -> f a) -> [t] -> f [a]
mapM (((k, v) -> m (k, v)) -> [(k, v)] -> m [(k, v)])
-> ((k, v) -> m (k, v)) -> [(k, v)] -> m [(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 :: forall k k' v. (k -> k') -> AssocList k v -> AssocList k' v
mapKeysMonotonic k -> k'
f = ((k, v) -> (k', v)) -> [(k, v)] -> [(k', v)]
forall a b. (a -> b) -> [a] -> [b]
map (((k, v) -> (k', v)) -> [(k, v)] -> [(k', v)])
-> ((k, v) -> (k', v)) -> [(k, v)] -> [(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