@@ -145,78 +145,97 @@ checkValid tree = length (nub (allHeights tree)) == one
145145 allHeights (Two left _ _ right) = map (\n -> n + one) (allHeights left <> allHeights right)
146146 allHeights (Three left _ _ mid _ _ right) = map (\n -> n + one) (allHeights left <> allHeights mid <> allHeights right)
147147
148- -- | Lookup a value for the specified key
148+ -- | Look up a value for the specified key
149149lookup :: forall k v . Ord k => k -> Map k v -> Maybe v
150- lookup = unsafePartial \k tree ->
151- case tree of
152- Leaf -> Nothing
153- _ ->
154- let comp :: k -> k -> Ordering
155- comp = compare
156- in case tree of
157- Two left k1 v right ->
158- case comp k k1 of
159- EQ -> Just v
160- LT -> lookup k left
161- _ -> lookup k right
162- Three left k1 v1 mid k2 v2 right ->
163- case comp k k1 of
164- EQ -> Just v1
165- c1 ->
166- case c1, comp k k2 of
167- _ , EQ -> Just v2
168- LT , _ -> lookup k left
169- _ , GT -> lookup k right
170- _ , _ -> lookup k mid
171-
172-
173- -- | Lookup a value for the specified key, or the greatest one less than it
150+ lookup k = go
151+ where
152+ comp :: k -> k -> Ordering
153+ comp = compare
154+
155+ go Leaf = Nothing
156+ go (Two left k1 v right) =
157+ case comp k k1 of
158+ EQ -> Just v
159+ LT -> go left
160+ _ -> go right
161+ go (Three left k1 v1 mid k2 v2 right) =
162+ case comp k k1 of
163+ EQ -> Just v1
164+ c1 ->
165+ case c1, comp k k2 of
166+ _ , EQ -> Just v2
167+ LT , _ -> go left
168+ _ , GT -> go right
169+ _ , _ -> go mid
170+
171+
172+ -- | Look up a value for the specified key, or the greatest one less than it
174173lookupLE :: forall k v . Ord k => k -> Map k v -> Maybe { key :: k , value :: v }
175- lookupLE _ Leaf = Nothing
176- lookupLE k (Two left k1 v1 right) = case compare k k1 of
177- EQ -> Just { key: k1, value: v1 }
178- GT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupLE k right
179- LT -> lookupLE k left
180- lookupLE k (Three left k1 v1 mid k2 v2 right) = case compare k k2 of
181- EQ -> Just { key: k2, value: v2 }
182- GT -> Just $ fromMaybe { key: k2, value: v2 } $ lookupLE k right
183- LT -> lookupLE k $ Two left k1 v1 mid
184-
185- -- | Lookup a value for the greatest key less than the specified key
174+ lookupLE k = go
175+ where
176+ comp :: k -> k -> Ordering
177+ comp = compare
178+
179+ go Leaf = Nothing
180+ go (Two left k1 v1 right) = case comp k k1 of
181+ EQ -> Just { key: k1, value: v1 }
182+ GT -> Just $ fromMaybe { key: k1, value: v1 } $ go right
183+ LT -> go left
184+ go (Three left k1 v1 mid k2 v2 right) = case comp k k2 of
185+ EQ -> Just { key: k2, value: v2 }
186+ GT -> Just $ fromMaybe { key: k2, value: v2 } $ go right
187+ LT -> go $ Two left k1 v1 mid
188+
189+ -- | Look up a value for the greatest key less than the specified key
186190lookupLT :: forall k v . Ord k => k -> Map k v -> Maybe { key :: k , value :: v }
187- lookupLT _ Leaf = Nothing
188- lookupLT k (Two left k1 v1 right) = case compare k k1 of
189- EQ -> findMax left
190- GT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupLT k right
191- LT -> lookupLT k left
192- lookupLT k (Three left k1 v1 mid k2 v2 right) = case compare k k2 of
193- EQ -> findMax $ Two left k1 v1 mid
194- GT -> Just $ fromMaybe { key: k2, value: v2 } $ lookupLT k right
195- LT -> lookupLT k $ Two left k1 v1 mid
196-
197- -- | Lookup a value for the specified key, or the least one greater than it
191+ lookupLT k = go
192+ where
193+ comp :: k -> k -> Ordering
194+ comp = compare
195+
196+ go Leaf = Nothing
197+ go (Two left k1 v1 right) = case comp k k1 of
198+ EQ -> findMax left
199+ GT -> Just $ fromMaybe { key: k1, value: v1 } $ go right
200+ LT -> go left
201+ go (Three left k1 v1 mid k2 v2 right) = case comp k k2 of
202+ EQ -> findMax $ Two left k1 v1 mid
203+ GT -> Just $ fromMaybe { key: k2, value: v2 } $ go right
204+ LT -> go $ Two left k1 v1 mid
205+
206+ -- | Look up a value for the specified key, or the least one greater than it
198207lookupGE :: forall k v . Ord k => k -> Map k v -> Maybe { key :: k , value :: v }
199- lookupGE _ Leaf = Nothing
200- lookupGE k (Two left k1 v1 right) = case compare k k1 of
201- EQ -> Just { key: k1, value: v1 }
202- LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGE k left
203- GT -> lookupGE k right
204- lookupGE k (Three left k1 v1 mid k2 v2 right) = case compare k k1 of
205- EQ -> Just { key: k1, value: v1 }
206- LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGE k left
207- GT -> lookupGE k $ Two mid k2 v2 right
208-
209- -- | Lookup a value for the least key greater than the specified key
208+ lookupGE k = go
209+ where
210+ comp :: k -> k -> Ordering
211+ comp = compare
212+
213+ go Leaf = Nothing
214+ go (Two left k1 v1 right) = case comp k k1 of
215+ EQ -> Just { key: k1, value: v1 }
216+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ go left
217+ GT -> go right
218+ go (Three left k1 v1 mid k2 v2 right) = case comp k k1 of
219+ EQ -> Just { key: k1, value: v1 }
220+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ go left
221+ GT -> go $ Two mid k2 v2 right
222+
223+ -- | Look up a value for the least key greater than the specified key
210224lookupGT :: forall k v . Ord k => k -> Map k v -> Maybe { key :: k , value :: v }
211- lookupGT _ Leaf = Nothing
212- lookupGT k (Two left k1 v1 right) = case compare k k1 of
213- EQ -> findMin right
214- LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGT k left
215- GT -> lookupGT k right
216- lookupGT k (Three left k1 v1 mid k2 v2 right) = case compare k k1 of
217- EQ -> findMin $ Two mid k2 v2 right
218- LT -> Just $ fromMaybe { key: k1, value: v1 } $ lookupGT k left
219- GT -> lookupGT k $ Two mid k2 v2 right
225+ lookupGT k = go
226+ where
227+ comp :: k -> k -> Ordering
228+ comp = compare
229+
230+ go Leaf = Nothing
231+ go (Two left k1 v1 right) = case comp k k1 of
232+ EQ -> findMin right
233+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ go left
234+ GT -> go right
235+ go (Three left k1 v1 mid k2 v2 right) = case comp k k1 of
236+ EQ -> findMin $ Two mid k2 v2 right
237+ LT -> Just $ fromMaybe { key: k1, value: v1 } $ go left
238+ GT -> go $ Two mid k2 v2 right
220239
221240-- | Returns the pair with the greatest key
222241findMax :: forall k v . Map k v -> Maybe { key :: k , value :: v }
0 commit comments