4 | import Data.SortedMap
9 | record ListMap k v where
10 | constructor MkListMap
12 | kvList : List (k, v)
15 | empty : Eq k => ListMap k v
16 | empty = MkListMap empty
19 | lookup : k -> ListMap k v -> Maybe v
20 | lookup k (MkListMap kv) = lookup k kv
22 | public export %inline
23 | lookup' : ListMap k v -> k -> Maybe v
24 | lookup' = flip lookup
27 | insert : k -> v -> ListMap k v -> ListMap k v
28 | insert k v (MkListMap kv) = MkListMap $
(k, v) :: kv
33 | insertWith : (v -> v -> v) -> k -> v -> ListMap k v -> ListMap k v
34 | insertWith f k v xs =
36 | Just x => insert k (f v x) xs
37 | Nothing => insert k v xs
39 | public export %inline
40 | insert' : ListMap k v -> (k, v) -> ListMap k v
41 | insert' = flip $
uncurry insert
44 | insertFrom : Foldable f => f (k, v) -> ListMap k v -> ListMap k v
45 | insertFrom = flip $
foldl insert'
47 | public export %inline
48 | insertFrom' : Foldable f => ListMap k v -> f (k, v) -> ListMap k v
49 | insertFrom' = flip insertFrom
54 | insertFromWith : Foldable f => (v -> v -> v) -> f (k, v) -> ListMap k v -> ListMap k v
55 | insertFromWith f = flip $
foldl $
flip $
uncurry $
insertWith f
58 | singleton : Eq k => k -> v -> ListMap k v
59 | singleton = MkListMap .: curry singleton
65 | updateExisting : (v -> v) -> k -> ListMap k v -> ListMap k v
66 | updateExisting f k m = case lookup k m of
67 | Just v => insert k (f v) m
70 | public export %inline
71 | updateExisting' : ListMap k v -> (v -> v) -> k -> ListMap k v
72 | updateExisting' m f x = updateExisting f x m
74 | public export %inline
75 | fromList : Eq k => List (k, v) -> ListMap k v
76 | fromList = MkListMap
80 | public export %inline
81 | rawKeys : ListMap k v -> List k
82 | rawKeys = map fst . kvList
86 | public export %inline
87 | rawValues : ListMap k v -> List v
88 | rawValues = map snd . kvList
91 | normalise : ListMap k v -> ListMap k v
92 | normalise (MkListMap kv) = MkListMap $
nubBy ((==) `on` fst) kv
96 | keys : ListMap k v -> List k
97 | keys = rawKeys . normalise
100 | keySet : ListMap k v -> ListSet k
101 | keySet m = MkListSet @{m.eq} $
rawKeys m
104 | public export %inline
105 | values : ListMap k v -> List v
106 | values = rawValues . normalise
109 | implementation Functor (ListMap k) where
110 | map f (MkListMap kv) = MkListMap $
map (map f) kv
113 | mapWithKey : (k -> a -> b) -> ListMap k a -> ListMap k b
114 | mapWithKey f = (\(MkListMap vs) => MkListMap $
vs <&> \(k, v) => (k, f k v)) . normalise
117 | mapWithKey' : ListMap k a -> (k -> a -> b) -> ListMap k b
118 | mapWithKey' = flip mapWithKey
123 | mergeWith : (v -> v -> v) -> ListMap k v -> ListMap k v -> ListMap k v
124 | mergeWith f x y = insertFrom inserted x where
125 | inserted : List (k, v)
128 | let v' = (maybe id f $
lookup k x) v
134 | merge : Semigroup v => ListMap k v -> ListMap k v -> ListMap k v
135 | merge = mergeWith (<+>)
139 | mergeLeft : ListMap k v -> ListMap k v -> ListMap k v
140 | mergeLeft (MkListMap @{eq} x) (MkListMap y) = MkListMap @{eq} $
x ++ y
142 | public export %inline
143 | toSortedMap : Ord k => ListMap k v -> SortedMap k v
144 | toSortedMap = fromList . kvList
147 | Foldable (ListMap k) where
148 | foldr f init = foldr f init . values
149 | foldl f init = foldl f init . values
150 | null $
MkListMap vs = null vs
151 | foldlM f init = foldlM f init . values
155 | Traversable (ListMap k) where
156 | traverse f $
MkListMap vs = MkListMap <$> traverse (traverse f) vs
159 | Semigroup v => Semigroup (ListMap k v) where
165 | (Ord k, Semigroup v) => Monoid (ListMap k v) where
169 | (Show k, Show v) => Show (ListMap k v) where
170 | show m = "fromList " ++ show (kvList m)