1 | module Data.Set.Internal
5 | import Derive.Prelude
8 | %language ElabReflection
20 | data Set : (a : Type) -> Type where
28 | %runElab derive "Set" [Eq,Ord,Show]
51 | size (Bin _ _ l r) =
104 | Bin (size l + size r + 1) x l r
120 | (Bin _ _ Tip Tip) =>
122 | (Bin _ lx Tip (Bin _ lrx _ _)) =>
123 | Bin 3 lrx (Bin 1 lx Tip Tip) (Bin 1 x Tip Tip)
124 | (Bin _ lx ll@(Bin _ _ _ _) Tip) =>
125 | Bin 3 lx ll (Bin 1 x Tip Tip)
126 | (Bin ls lx ll@(Bin lls _ _ _) lr@(Bin lrs lrx lrl lrr)) =>
127 | case lrs < ratio * lls of
129 | Bin (1+ls) lx ll (Bin (1+lrs) x lr Tip)
131 | Bin (1+ls) lrx (Bin (1+lls+size lrl) lx ll lrl) (Bin (1+size lrr) x lrr Tip)
136 | (Bin ls lx ll lr) =>
137 | case ls > delta * rs of
140 | (Bin lls _ _ _, Bin lrs lrx lrl lrr) =>
141 | case lrs < ratio * lls of
143 | Bin (1+ls+rs) lx ll (Bin (1+rs+lrs) x lr r)
145 | Bin (1+ls+rs) lrx (Bin (1+lls+size lrl) lx ll lrl) (Bin (1+rs+size lrr) x lrr r)
147 | assert_total $
idris_crash "Failure in Data.Set.Internal.balanceL"
149 | Bin (1+ls+rs) x l r
165 | (Bin _ _ Tip Tip) =>
167 | (Bin _ rx Tip rr@(Bin _ _ _ _)) =>
168 | Bin 3 rx (Bin 1 x Tip Tip) rr
169 | (Bin _ rx (Bin _ rlx _ _) Tip) =>
170 | Bin 3 rlx (Bin 1 x Tip Tip) (Bin 1 rx Tip Tip)
171 | (Bin rs rx rl@(Bin rls rlx rll rlr) rr@(Bin rrs _ _ _)) =>
172 | case rls < ratio * rrs of
174 | Bin (1+rs) rx (Bin (1+rls) x Tip rl) rr
176 | Bin (1+rs) rlx (Bin (1+size rll) x Tip rll) (Bin (1+rrs+size rlr) rx rlr rr)
181 | (Bin rs rx rl rr) =>
182 | case rs > delta * ls of
185 | (Bin rls rlx rll rlr, Bin rrs _ _ _) =>
186 | case rls < ratio * rrs of
188 | Bin (1+ls+rs) rx (Bin (1+ls+rls) x l rl) rr
190 | Bin (1+ls+rs) rlx (Bin (1+ls+size rll) x l rll) (Bin (1+rrs+size rlr) rx rlr rr)
192 | assert_total $
idris_crash "Failure in Data.Set.Internal.balanceR"
194 | Bin (1+ls+rs) x l r
205 | balanceR y l (insertMax x r)
216 | balanceL y (insertMin x l) r
223 | minViewSure x Tip r =
225 | minViewSure x (Bin _ xl ll lr) r =
226 | case minViewSure xl ll lr of
228 | (xm, balanceR x l' r)
235 | maxViewSure x l Tip =
237 | maxViewSure x l (Bin _ xr rl rr) =
238 | case maxViewSure xr rl rr of
240 | (xm, balanceL x l r')
251 | glue l@(Bin sl xl ll lr) r@(Bin sr xr rl rr) =
254 | let (m, l') = maxViewSure xl ll lr
257 | let (m, r') = minViewSure xr rl rr
270 | link x l@(Bin sizeL y ly ry) r@(Bin sizeR z lz rz) =
271 | case delta * sizeL < sizeR of
273 | balanceL z (link x l lz) rz
275 | case delta * sizeR < sizeL of
277 | balanceR y ly (link x ry r)