1 | module Data.Map.Internal
5 | import Derive.Prelude
8 | %language ElabReflection
20 | data Map : (k : Type) -> (v : Type) -> Type where
29 | %runElab derive "Map" [Eq,Ord,Show]
32 | data MinView k a = MinView' k a (Map k a)
34 | %runElab derive "MinView" [Eq,Ord,Show]
37 | data MaxView k a = MaxView' k a (Map k a)
39 | %runElab derive "MaxView" [Eq,Ord,Show]
63 | size (Bin _ _ _ l r) =
116 | Bin (size l + size r + 1) k x l r
131 | (Bin _ _ _ Tip Tip) =>
133 | (Bin _ rk rx Tip rr@(Bin _ _ _ _ _)) =>
134 | Bin 3 rk rx (Bin 1 k x Tip Tip) rr
135 | (Bin _ rk rx (Bin _ rlk rlx _ _) Tip) =>
136 | Bin 3 rlk rlx (Bin 1 k x Tip Tip) (Bin 1 rk rx Tip Tip)
137 | (Bin rs rk rx rl@(Bin rls rlk rlx rll rlr) rr@(Bin rrs _ _ _ _)) =>
138 | case rls < ratio * rrs of
140 | Bin (1+rs) rk rx (Bin (1+rls) k x Tip rl) rr
142 | Bin (1+rs) rlk rlx (Bin (1+size rll) k x Tip rll) (Bin (1+rrs+size rlr) rk rx rlr rr)
143 | (Bin ls lk lx ll lr) =>
149 | (Tip, (Bin _ lrk lrx _ _)) =>
150 | Bin 3 lrk lrx (Bin 1 lk lx Tip Tip) (Bin 1 k x Tip Tip)
151 | ((Bin _ _ _ _ _), Tip) =>
152 | Bin 3 lk lx ll (Bin 1 k x Tip Tip)
153 | ((Bin lls _ _ _ _), (Bin lrs lrk lrx lrl lrr)) =>
154 | case lrs < ratio * lls of
156 | Bin (1+ls) lk lx ll (Bin (1+lrs) k x lr Tip)
158 | Bin (1+ls) lrk lrx (Bin (1+lls+size lrl) lk lx ll lrl) (Bin (1+size lrr) k x lrr Tip)
159 | (Bin rs rk rx rl rr) =>
160 | case rs > delta * ls of
163 | (Bin rls rlk rlx rll rlr, Bin rrs _ _ _ _) =>
164 | case rls < ratio * rrs of
166 | Bin (1+ls+rs) rk rx (Bin (1+ls+rls) k x l rl) rr
168 | Bin (1+ls+rs) rlk rlx (Bin (1+ls+size rll) k x l rll) (Bin (1+rrs+size rlr) rk rx rlr rr)
170 | assert_total $
idris_crash "Failure in Data.Map.Internal.balance"
172 | case ls > delta * rs of
175 | (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr) =>
176 | case lrs < ratio * lls of
178 | Bin (1+ls+rs) lk lx ll (Bin (1+rs+lrs) k x lr r)
180 | Bin (1+ls+rs) lrk lrx (Bin (1+lls+size lrl) lk lx ll lrl) (Bin (1+rs+size lrr) k x lrr r)
182 | assert_total $
idris_crash "Failure in Data.Map.Internal.balance"
184 | Bin (1+ls+rs) k x l r
201 | (Bin _ _ _ Tip Tip) =>
203 | (Bin _ lk lx Tip (Bin _ lrk lrx _ _)) =>
204 | Bin 3 lrk lrx (Bin 1 lk lx Tip Tip) (Bin 1 k x Tip Tip)
205 | (Bin _ lk lx ll@(Bin _ _ _ _ _) Tip) =>
206 | Bin 3 lk lx ll (Bin 1 k x Tip Tip)
207 | (Bin ls lk lx ll@(Bin lls _ _ _ _) lr@(Bin lrs lrk lrx lrl lrr)) =>
208 | case lrs < ratio * lls of
210 | Bin (1+ls) lk lx ll (Bin (1+lrs) k x lr Tip)
212 | Bin (1+ls) lrk lrx (Bin (1+lls+size lrl) lk lx ll lrl) (Bin (1+size lrr) k x lrr Tip)
213 | (Bin rs _ _ _ _) =>
216 | Bin (1+rs) k x Tip r
217 | (Bin ls lk lx ll lr) =>
218 | case ls > delta * rs of
221 | (Bin lls _ _ _ _, Bin lrs lrk lrx lrl lrr) =>
222 | case lrs < ratio * lls of
224 | Bin (1+ls+rs) lk lx ll (Bin (1+rs+lrs) k x lr r)
226 | Bin (1+ls+rs) lrk lrx (Bin (1+lls+size lrl) lk lx ll lrl) (Bin (1+rs+size lrr) k x lrr r)
228 | assert_total $
idris_crash "Failure in Data.Map.Internal.balanceL"
230 | Bin (1+ls+rs) k x l r
247 | (Bin _ _ _ Tip Tip ) =>
249 | (Bin _ rk rx Tip rr@(Bin _ _ _ _ _)) =>
250 | Bin 3 rk rx (Bin 1 k x Tip Tip) rr
251 | (Bin _ rk rx (Bin _ rlk rlx _ _) Tip) =>
252 | Bin 3 rlk rlx (Bin 1 k x Tip Tip) (Bin 1 rk rx Tip Tip)
253 | (Bin rs rk rx rl@(Bin rls rlk rlx rll rlr) rr@(Bin rrs _ _ _ _)) =>
254 | case rls < ratio * rrs of
256 | Bin (1+rs) rk rx (Bin (1+rls) k x Tip rl) rr
258 | Bin (1+rs) rlk rlx (Bin (1+size rll) k x Tip rll) (Bin (1+rrs+size rlr) rk rx rlr rr)
259 | (Bin ls _ _ _ _) =>
262 | Bin (1+ls) k x l Tip
263 | (Bin rs rk rx rl rr) =>
264 | case rs > delta * ls of
267 | (Bin rls rlk rlx rll rlr, Bin rrs _ _ _ _) =>
268 | case rls < ratio * rrs of
270 | Bin (1+ls+rs) rk rx (Bin (1+ls+rls) k x l rl) rr
272 | Bin (1+ls+rs) rlk rlx (Bin (1+ls+size rll) k x l rll) (Bin (1+rrs+size rlr) rk rx rlr rr)
274 | assert_total $
idris_crash "Failure in Data.Map.Internal.balanceR"
276 | Bin (1+ls+rs) k x l r
288 | balanceR ky y l (insertMax kx x r)
300 | balanceL ky y (insertMin kx x l) r
308 | minViewSure k x Tip r =
310 | minViewSure k x (Bin _ kl xl ll lr) r =
311 | case minViewSure kl xl ll lr of
312 | MinView' km xm l' => MinView' km xm (balanceR k x l' r)
320 | maxViewSure k x l Tip =
322 | maxViewSure k x l (Bin _ kr xr rl rr) =
323 | case maxViewSure kr xr rl rr of
324 | MaxView' km xm r' => MaxView' km xm (balanceL k x l r')
335 | glue l@(Bin sl kl xl ll lr) r@(Bin sr kr xr rl rr) =
338 | let (MaxView' km m l') = maxViewSure kl xl ll lr
339 | in balanceR km m l' r
341 | let (MinView' km m r') = minViewSure kr xr rl rr
342 | in balanceL km m l r'
353 | link2 l@(Bin sizeL kx x lx rx) r@(Bin sizeR ky y ly ry) =
354 | case delta * sizeL < sizeR of
356 | balanceL ky y (link2 l ly) ry
358 | case delta * sizeR < sizeL of
360 | balanceR kx x lx (link2 rx r)
375 | link kx x l@(Bin sizeL ky y ly ry) r@(Bin sizeR kz z lz rz) =
376 | case delta * sizeL < sizeR of
378 | balanceL kz z (link kx x l lz) rz
380 | case delta * sizeR < sizeL of
382 | balanceR ky y ly (link kx x ry r)