@@ -10,6 +10,12 @@ module Data.Map
10
10
, checkValid
11
11
, insert
12
12
, lookup
13
+ , lookupLE
14
+ , lookupLT
15
+ , lookupGE
16
+ , lookupGT
17
+ , findMin
18
+ , findMax
13
19
, fromFoldable
14
20
, fromFoldableWith
15
21
, toList
@@ -32,7 +38,7 @@ import Prelude
32
38
33
39
import Data.Foldable (foldl , foldMap , foldr , class Foldable )
34
40
import Data.List (List (..), length , nub )
35
- import Data.Maybe (Maybe (..), maybe , isJust )
41
+ import Data.Maybe (Maybe (..), maybe , isJust , fromMaybe )
36
42
import Data.Monoid (class Monoid )
37
43
import Data.Traversable (traverse , class Traversable )
38
44
import Data.Tuple (Tuple (..), uncurry , snd )
@@ -139,6 +145,67 @@ lookup = unsafePartial \k tree ->
139
145
_ , GT -> lookup k right
140
146
_ , _ -> lookup k mid
141
147
148
+
149
+ -- | Lookup a value for the specified key, or the greatest one less than it
150
+ lookupLE :: forall k v . (Ord k ) => k -> Map k v -> Maybe { key :: k , value :: v }
151
+ lookupLE _ Leaf = Nothing
152
+ lookupLE k (Two left k1 v1 right) = case compare k k1 of
153
+ EQ -> Just { key: k1, value: v1 }
154
+ GT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupLE k right
155
+ LT -> lookupLE k left
156
+ lookupLE k (Three left k1 v1 mid k2 v2 right) = case compare k k2 of
157
+ EQ -> Just { key: k2, value: v2 }
158
+ GT -> Just $ fromMaybe { key: k2, value: v2 } $ lookupLE k right
159
+ LT -> lookupLE k $ Two left k1 v1 mid
160
+
161
+ -- | Lookup a value for the greatest key less than the specified key
162
+ lookupLT :: forall k v . (Ord k ) => k -> Map k v -> Maybe { key :: k , value :: v }
163
+ lookupLT _ Leaf = Nothing
164
+ lookupLT k (Two left k1 v1 right) = case compare k k1 of
165
+ EQ -> findMax left
166
+ GT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupLT k right
167
+ LT -> lookupLT k left
168
+ lookupLT k (Three left k1 v1 mid k2 v2 right) = case compare k k2 of
169
+ EQ -> findMax $ Two left k1 v1 mid
170
+ GT -> Just $ fromMaybe { key: k2, value: v2 } $ lookupLT k right
171
+ LT -> lookupLT k $ Two left k1 v1 mid
172
+
173
+ -- | Lookup a value for the specified key, or the least one greater than it
174
+ lookupGE :: forall k v . (Ord k ) => k -> Map k v -> Maybe { key :: k , value :: v }
175
+ lookupGE _ Leaf = Nothing
176
+ lookupGE k (Two left k1 v1 right) = case compare k k1 of
177
+ EQ -> Just { key: k1, value: v1 }
178
+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGE k left
179
+ GT -> lookupGE k right
180
+ lookupGE k (Three left k1 v1 mid k2 v2 right) = case compare k k1 of
181
+ EQ -> Just { key: k1, value: v1 }
182
+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGE k left
183
+ GT -> lookupGE k $ Two mid k2 v2 right
184
+
185
+ -- | Lookup a value for the least key greater than the specified key
186
+ lookupGT :: forall k v . (Ord k ) => k -> Map k v -> Maybe { key :: k , value :: v }
187
+ lookupGT _ Leaf = Nothing
188
+ lookupGT k (Two left k1 v1 right) = case compare k k1 of
189
+ EQ -> findMin right
190
+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGT k left
191
+ GT -> lookupGT k right
192
+ lookupGT k (Three left k1 v1 mid k2 v2 right) = case compare k k1 of
193
+ EQ -> findMin $ Two mid k2 v2 right
194
+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGT k left
195
+ GT -> lookupGT k $ Two mid k2 v2 right
196
+
197
+ -- | Returns the pair with the greatest key
198
+ findMax :: forall k v . Map k v -> Maybe { key :: k , value :: v }
199
+ findMax Leaf = Nothing
200
+ findMax (Two _ k1 v1 right) = Just $ fromMaybe { key: k1, value: v1 } $ findMax right
201
+ findMax (Three _ _ _ _ k2 v2 right) = Just $ fromMaybe { key: k2, value: v2 } $ findMax right
202
+
203
+ -- | Returns the pair with the least key
204
+ findMin :: forall k v . Map k v -> Maybe { key :: k , value :: v }
205
+ findMin Leaf = Nothing
206
+ findMin (Two left k1 v1 _) = Just $ fromMaybe { key: k1, value: v1 } $ findMin left
207
+ findMin (Three left k1 v1 _ _ _ _) = Just $ fromMaybe { key: k1, value: v1 } $ findMin left
208
+
142
209
-- | Test if a key is a member of a map
143
210
member :: forall k v . Ord k => k -> Map k v -> Boolean
144
211
member k m = isJust (k `lookup` m)
0 commit comments