0 | module Data.SortedMap
2 | import Data.SortedMap.Dependent
6 | record SortedMap k v where
8 | unM : SortedDMap k $
const v
11 | unDPair : (x : a ** const b x) -> (a, b)
12 | unDPair (
k ** v)
= (k, v)
15 | empty : Ord k => SortedMap k v
19 | lookup : k -> SortedMap k v -> Maybe v
20 | lookup k = map snd . lookup k . unM
22 | public export %inline
23 | lookup' : SortedMap k v -> k -> Maybe v
24 | lookup' = flip lookup
27 | insert : k -> v -> SortedMap k v -> SortedMap k v
28 | insert k v = M . insert k v . unM
33 | insertWith : (v -> v -> v) -> k -> v -> SortedMap k v -> SortedMap 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' : SortedMap k v -> (k, v) -> SortedMap k v
41 | insert' = flip $
uncurry insert
44 | singleton : Ord k => k -> v -> SortedMap k v
45 | singleton = M .: singleton
48 | insertFrom : Foldable f => f (k, v) -> SortedMap k v -> SortedMap k v
49 | insertFrom = flip $
foldl insert'
51 | public export %inline
52 | insertFrom' : Foldable f => SortedMap k v -> f (k, v) -> SortedMap k v
53 | insertFrom' = flip insertFrom
58 | insertFromWith : Foldable f => (v -> v -> v) -> f (k, v) -> SortedMap k v -> SortedMap k v
59 | insertFromWith f = flip $
foldl $
flip $
uncurry $
insertWith f
62 | delete : k -> SortedMap k v -> SortedMap k v
63 | delete k = M . delete k . unM
65 | public export %inline
66 | delete' : SortedMap k v -> k -> SortedMap k v
67 | delete' = flip delete
77 | update : (Maybe v -> Maybe v) -> k -> SortedMap k v -> SortedMap k v
78 | update f k m = case f $
lookup k m of
79 | Just v => insert k v m
80 | Nothing => delete k m
82 | public export %inline
83 | update' : SortedMap k v -> (Maybe v -> Maybe v) -> k -> SortedMap k v
84 | update' m f x = update f x m
90 | updateExisting : (v -> v) -> k -> SortedMap k v -> SortedMap k v
91 | updateExisting f k m = case lookup k m of
92 | Just v => insert k (f v) m
95 | public export %inline
96 | updateExisting' : SortedMap k v -> (v -> v) -> k -> SortedMap k v
97 | updateExisting' m f x = updateExisting f x m
100 | fromList : Ord k => List (k, v) -> SortedMap k v
101 | fromList = insertFrom' empty
106 | fromListWith : Ord k => (v -> v -> v) -> List (k, v) -> SortedMap k v
107 | fromListWith f = flip (insertFromWith f) empty
110 | toList : SortedMap k v -> List (k, v)
111 | toList = map unDPair . kvList . unM
114 | public export %inline
115 | kvList : SortedMap k v -> List (k, v)
120 | keys : SortedMap k v -> List k
121 | keys = map fst . kvList
125 | values : SortedMap k v -> List v
126 | values = map snd . kvList
129 | implementation Functor (SortedMap k) where
130 | map f = M . map f . unM
133 | implementation Foldable (SortedMap k) where
134 | foldr f z = foldr f z . values
135 | foldl f z = foldl f z . values
139 | foldMap f = foldMap f . values
142 | implementation Traversable (SortedMap k) where
143 | traverse f = map M . traverse f . unM
146 | implementation Ord k => Zippable (SortedMap k) where
147 | zipWith f mx my = fromList $
mapMaybe (\(k, x) => (k,) . f x <$> lookup k my) $
kvList mx
148 | zipWith3 f mx my mz = fromList $
mapMaybe (\(k, x) => (k,) .: f x <$> lookup k my <*> lookup k mz) $
kvList mx
149 | unzipWith f m = let m' = map f m in (map fst m', map snd m')
150 | unzipWith3 f m = let m' = map f m in (map fst m', map (fst . snd) m', map (snd . snd) m')
155 | mergeWith : (v -> v -> v) -> SortedMap k v -> SortedMap k v -> SortedMap k v
156 | mergeWith f x y = insertFrom inserted x where
157 | inserted : List (k, v)
160 | let v' = (maybe id f $
lookup k x) v
166 | merge : Semigroup v => SortedMap k v -> SortedMap k v -> SortedMap k v
167 | merge = mergeWith (<+>)
171 | mergeLeft : SortedMap k v -> SortedMap k v -> SortedMap k v
172 | mergeLeft = mergeWith const
178 | lookupBetween : key -> SortedMap key val -> (Maybe (key,val), Maybe (key,val))
179 | lookupBetween k = bimap (map unDPair) (map unDPair) . lookupBetween k . unM
184 | leftMost : SortedMap key val -> Maybe (key,val)
185 | leftMost = map unDPair . leftMost . unM
190 | rightMost : SortedMap key val -> Maybe (key,val)
191 | rightMost = map unDPair . rightMost . unM
196 | pop : SortedMap k v -> Maybe ((k, v), SortedMap k v)
197 | pop = map (bimap unDPair M) . pop . unM
200 | (Show k, Show v) => Show (SortedMap k v) where
201 | show m = "fromList " ++ show (kvList m)
204 | (Eq k, Eq v) => Eq (SortedMap k v) where
205 | (==) = (==) `on` kvList
213 | Semigroup v => Semigroup (SortedMap k v) where
219 | (Ord k, Semigroup v) => Monoid (SortedMap k v) where
223 | Cast (SortedDMap k (const v)) (SortedMap k v) where
227 | Cast (SortedMap k v) (SortedDMap k (const v)) where