@@ -10,6 +10,12 @@ module Data.Map
1010 , checkValid
1111 , insert
1212 , lookup
13+ , lookupLE
14+ , lookupLT
15+ , lookupGE
16+ , lookupGT
17+ , findMin
18+ , findMax
1319 , fromFoldable
1420 , fromFoldableWith
1521 , toList
@@ -32,7 +38,7 @@ import Prelude
3238
3339import Data.Foldable (foldl , foldMap , foldr , class Foldable )
3440import Data.List (List (..), length , nub )
35- import Data.Maybe (Maybe (..), maybe , isJust )
41+ import Data.Maybe (Maybe (..), maybe , isJust , fromMaybe )
3642import Data.Monoid (class Monoid )
3743import Data.Traversable (traverse , class Traversable )
3844import Data.Tuple (Tuple (..), uncurry , snd )
@@ -139,6 +145,67 @@ lookup = unsafePartial \k tree ->
139145 _ , GT -> lookup k right
140146 _ , _ -> lookup k mid
141147
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+
142209-- | Test if a key is a member of a map
143210member :: forall k v . Ord k => k -> Map k v -> Boolean
144211member k m = isJust (k `lookup` m)
0 commit comments