1 | module Data.RRBVector.Unsized
3 | import public Data.RRBVector.Unsized.Internal
5 | import Control.Monad.ST
7 | import Data.Array.Core
8 | import Data.Array.Index
9 | import Data.Array.Indexed
14 | import Data.SnocList
16 | import Data.Zippable
17 | import Syntax.T1 as T1
20 | %hide Prelude.Ops.infixr.(<|)
21 | %hide Prelude.Ops.infixl.(|>)
51 | singleton x = Root 1 0 (Leaf $
A 1 $
fill 1 x)
58 | fromList [x] = singleton x
60 | case nodes Leaf xs of
62 | Root (treeSize 0 tree) 0 tree
64 | assert_smaller xs (iterateNodes blockshift xs')
66 | nodes : (Array a -> Tree a)
70 | let (trees', rest) = unsafeAlloc blocksize (go 0 blocksize f trees)
75 | (trees' :: nodes f (assert_smaller trees rest'))
78 | -> (Array a -> Tree a)
80 | -> WithMArray n a (Tree a,List a)
81 | go cur n f [] r = T1.do
82 | res <- unsafeFreeze r
83 | pure $
(f $
force $
take cur $
A n res,[])
84 | go cur n f (x :: xs) r =
87 | res <- unsafeFreeze r
88 | pure $
(f $
A n res, x :: xs)
90 | case tryNatToFin cur of
92 | assert_total $
idris_crash "Data.RRBVector.Unsized.fromList.node: can't convert Nat to Fin"
96 | nodes' : (Array (Tree a) -> Tree a)
100 | let (trees', rest) = unsafeAlloc blocksize (go 0 blocksize f trees)
105 | (trees' :: nodes' f (assert_smaller trees rest'))
108 | -> (Array (Tree a) -> Tree a)
110 | -> WithMArray n (Tree a) (Tree a,List (Tree a))
111 | go cur n f [] r = T1.do
112 | res <- unsafeFreeze r
113 | pure $
(f $
force $
take cur $
A n res,[])
114 | go cur n f (x :: xs) r =
117 | res <- unsafeFreeze r
118 | pure $
(f $
A n res, x :: xs)
120 | case tryNatToFin cur of
122 | assert_total $
idris_crash "Data.RRBVector.Unsized.fromList.node': can't convert Nat to Fin"
125 | go (S cur) n f xs r
129 | iterateNodes sh trees =
130 | case nodes' Balanced trees of
132 | Root (treeSize sh tree) sh tree
134 | iterateNodes (up sh) (assert_smaller trees trees')
142 | case compare n 0 of
148 | case compare n blocksize of
150 | Root n 0 (Leaf $
A n $
fill n x)
152 | Root n 0 (Leaf $
A n $
fill n x)
154 | let size' = integerToNat ((natToInteger $
minus n 1) .&. (natToInteger $
plus blockmask 1))
155 | in iterateNodes blockshift
156 | (Leaf $
A blocksize $
fill blocksize x)
157 | (Leaf $
A size' $
fill size' x)
159 | iterateNodes : Shift
163 | iterateNodes sh full rest =
164 | let subtreesm1 = (natToInteger $
minus n 1) `shiftR` sh
165 | restsize = integerToNat (subtreesm1 .&. (natToInteger blockmask))
166 | rest' = Balanced $
A (plus restsize 1) $
append (fill restsize full) (fill 1 rest)
167 | in case compare subtreesm1 (natToInteger blocksize) of
171 | let full' = Balanced (A blocksize $
fill blocksize full)
172 | in iterateNodes (up sh) (assert_smaller full full') (assert_smaller rest rest')
174 | let full' = Balanced (A blocksize $
fill blocksize full)
175 | in iterateNodes (up sh) (assert_smaller full full') (assert_smaller rest rest')
183 | toList : RRBVector a
186 | toList (Root _ _ tree) = treeToList tree
188 | treeToList : Tree a
190 | treeToList (Balanced trees) = assert_total $
concat (map treeToList (toList trees))
191 | treeToList (Unbalanced trees _) = assert_total $
concat (map treeToList (toList trees))
192 | treeToList (Leaf arr) = toList arr
199 | foldl : (b -> a -> b)
208 | foldlTree acc' (Balanced arr) = assert_total $
foldl foldlTree acc' arr
209 | foldlTree acc' (Unbalanced arr _) = assert_total $
foldl foldlTree acc' arr
210 | foldlTree acc' (Leaf arr) = assert_total $
foldl f acc' arr
214 | go (Root _ _ tree) = assert_total $
foldlTree acc tree
217 | foldr : (a -> b -> b)
226 | foldrTree (Balanced arr) acc' = assert_total $
foldr foldrTree acc' arr
227 | foldrTree (Unbalanced arr _) acc' = assert_total $
foldr foldrTree acc' arr
228 | foldrTree (Leaf arr) acc' = assert_total $
foldr f acc' arr
232 | go (Root _ _ tree) = assert_total $
foldrTree tree acc
247 | length : RRBVector a
250 | length (Root s _ _) = s
261 | lookup _ Empty = Nothing
262 | lookup i (Root size sh tree) =
263 | case compare i 0 of
267 | case compare i size of
273 | Just $
lookupTree i sh tree
275 | case compare i size of
281 | Just $
lookupTree i sh tree
287 | lookupTree i sh (Balanced arr) =
288 | case tryNatToFin (radixIndex i sh) of
290 | assert_total $
idris_crash "Data.RRBVector.Unsized.lookup: can't convert Nat to Fin"
292 | assert_total $
lookupTree i (down sh) (at arr.arr i')
293 | lookupTree i sh (Unbalanced arr sizes) =
294 | let (idx, subidx) = relaxedRadixIndex sizes i sh
295 | in case tryNatToFin idx of
297 | assert_total $
idris_crash "Data.RRBVector.Unsized.lookup: can't convert Nat to Fin"
299 | assert_total $
lookupTree subidx (down sh) (at arr.arr idx')
300 | lookupTree i _ (Leaf arr) =
301 | let i' = integerToNat ((natToInteger i) .&. (natToInteger blockmask))
302 | in case tryNatToFin i' of
304 | assert_total $
idris_crash "Data.RRBVector.Unsized.lookup: can't convert Nat to Fin"
314 | index i = fromMaybe (assert_total $
idris_crash "Data.RRBVector.Unsized.index: index out of range") . lookup i
337 | update _ _ Empty = Empty
338 | update i x v@(Root size sh tree) =
339 | case compare i 0 of
343 | case compare i size of
349 | Root size sh (updateTree i sh tree)
351 | case compare i size of
357 | Root size sh (updateTree i sh tree)
363 | updateTree i sh (Balanced arr) =
364 | case tryNatToFin (radixIndex i sh) of
366 | assert_total $
idris_crash "Data.RRBVector.Unsized.update: can't convert Nat to Fin"
368 | assert_total $
Balanced (A arr.size (updateAt i' (updateTree i (down sh)) arr.arr))
369 | updateTree i sh (Unbalanced arr sizes) =
370 | let (idx, subidx) = relaxedRadixIndex sizes i sh
371 | in case tryNatToFin idx of
373 | assert_total $
idris_crash "Data.RRBVector.Unsized.update: can't convert Nat to Fin"
375 | assert_total $
Unbalanced (A arr.size (updateAt idx' (updateTree subidx (down sh)) arr.arr)) sizes
376 | updateTree i _ (Leaf arr) =
377 | let i' = integerToNat ((natToInteger i) .&. (natToInteger blockmask))
378 | in case tryNatToFin i' of
380 | assert_total $
idris_crash "Data.RRBVector.Unsized.update: can't convert Nat to Fin"
382 | Leaf (A arr.size (setAt i'' x arr.arr))
391 | adjust _ _ Empty = Empty
392 | adjust i f v@(Root size sh tree) =
393 | case compare i 0 of
397 | case compare i size of
403 | Root size sh (adjustTree i sh tree)
405 | case compare i size of
411 | Root size sh (adjustTree i sh tree)
417 | adjustTree i sh (Balanced arr) =
418 | case tryNatToFin (radixIndex i sh) of
420 | assert_total $
idris_crash "Data.RRBVector.Unsized.adjust: can't convert Nat to Fin"
422 | assert_total $
Balanced (A arr.size (updateAt i' (adjustTree i (down sh)) arr.arr))
423 | adjustTree i sh (Unbalanced arr sizes) =
424 | let (idx, subidx) = relaxedRadixIndex sizes i sh
425 | in case tryNatToFin idx of
427 | assert_total $
idris_crash "Data.RRBVector.Unsized.adjust: can't convert Nat to Fin"
429 | assert_total $
Unbalanced (A arr.size (updateAt idx' (adjustTree subidx (down sh)) arr.arr)) sizes
430 | adjustTree i _ (Leaf arr) =
431 | let i' = integerToNat ((natToInteger i) .&. (natToInteger blockmask))
432 | in case tryNatToFin i' of
434 | assert_total $
idris_crash "Data.RRBVector.Unsized.adjust: can't convert Nat to Fin"
436 | Leaf (A arr.size (updateAt i'' f arr.arr))
439 | normalize : RRBVector a
441 | normalize v@(Root size sh (Balanced arr)) =
442 | case compare arr.size 1 of
446 | case tryNatToFin 0 of
448 | assert_total $
idris_crash "Data.RRBVector.Unsized.normalize: can't convert Nat to Fin"
450 | assert_total $
normalize $
Root size (down sh) (at arr.arr i)
453 | normalize v@(Root size sh (Unbalanced arr _)) =
454 | case compare arr.size 1 of
458 | case tryNatToFin 0 of
460 | assert_total $
idris_crash "Data.RRBVector.Unsized.normalize: can't convert Nat to Fin"
462 | assert_total $
normalize $
Root size (down sh) (at arr.arr i)
474 | takeTree i sh (Balanced arr) with (radixIndex i sh) | ((plus (radixIndex i sh) 1) <= arr.size) proof eq
476 | case tryNatToFin i' of
478 | assert_total $
idris_crash "Data.RRBVector.Unsized.takeTree: can't convert Nat to Fin"
480 | let newarr = force $
take (plus (radixIndex i sh) 1) arr.arr @{lteOpReflectsLTE _ _ eq}
481 | in assert_total $
Balanced (A (plus (radixIndex i sh) 1) (updateAt i'' (takeTree i (down sh)) newarr))
483 | assert_total $
idris_crash "Data.RRBVector.Unsized.takeTree: index out of bounds"
484 | takeTree i sh (Unbalanced arr sizes) with (relaxedRadixIndex sizes i sh) | ((plus (fst (relaxedRadixIndex sizes i sh)) 1) <= arr.size) proof eq
485 | _ | (idx, subidx) | True =
486 | case tryNatToFin idx of
488 | assert_total $
idris_crash "Data.RRBVector.Unsized.takeTree: can't convert Nat to Fin"
490 | let newarr = force $
take (plus (fst (relaxedRadixIndex sizes i sh)) 1) arr.arr @{lteOpReflectsLTE _ _ eq}
491 | in assert_total $
computeSizes sh (A (plus (fst (relaxedRadixIndex sizes i sh)) 1) (updateAt idx' (takeTree subidx (down sh)) newarr))
493 | assert_total $
idris_crash "Data.RRBVector.Unsized.takeTree: index out of bounds"
494 | takeTree i _ (Leaf arr) with (integerToNat (((natToInteger i) .&. (natToInteger blockmask)) + 1) <= arr.size) proof eq
496 | let newarr = force $
take (integerToNat (((natToInteger i) .&. (natToInteger blockmask)) + 1)) arr.arr @{lteOpReflectsLTE _ _ eq}
497 | in Leaf (A (integerToNat (((natToInteger i) .&. (natToInteger blockmask)) + 1)) newarr)
499 | assert_total $
idris_crash "Data.RRBVector.Unsized.takeTree: index out of bounds"
506 | dropTree n sh (Balanced arr) =
507 | case tryNatToFin 0 of
509 | assert_total $
idris_crash "Data.RRBVector.Unsized.dropTree: can't convert Nat to Fin"
511 | let newarr = force $
drop (radixIndex n sh) arr.arr
512 | in assert_total $
computeSizes sh (A (minus arr.size (radixIndex n sh)) (updateAt zero (dropTree n (down sh)) newarr))
513 | dropTree n sh (Unbalanced arr sizes) =
514 | case tryNatToFin 0 of
516 | assert_total $
idris_crash "Data.RRBVector.Unsized.dropTree: can't convert Nat to Fin"
518 | let newarr = force $
drop (fst $
relaxedRadixIndex sizes n sh) arr.arr
519 | in assert_total $
computeSizes sh (A (minus arr.size (fst $
relaxedRadixIndex sizes n sh)) (updateAt zero (dropTree (snd $
relaxedRadixIndex sizes n sh) (down sh)) newarr))
520 | dropTree n _ (Leaf arr) =
521 | let n = integerToNat ((natToInteger n) .&. (natToInteger blockmask))
522 | newarr = force $
drop n arr.arr
523 | in Leaf (A (minus arr.size n) newarr)
531 | take _ Empty = Empty
532 | take n v@(Root size sh tree) =
533 | case compare n 0 of
539 | case compare n size of
541 | normalize $
Root n sh (takeTree (minus n 1) sh tree)
553 | drop _ Empty = Empty
554 | drop n v@(Root size sh tree) =
555 | case compare n 0 of
561 | case compare n size of
563 | normalize $
Root (minus size n) sh (dropTree n sh tree)
573 | -> (RRBVector a, RRBVector a)
574 | splitAt _ Empty = (Empty, Empty)
575 | splitAt n v@(Root size sh tree) =
576 | case compare n 0 of
582 | case compare n size of
584 | let left = normalize $
Root n sh (takeTree (minus n 1) sh tree)
585 | right = normalize $
Root (minus size n) sh (dropTree n sh tree)
598 | viewl : RRBVector a
599 | -> Maybe (a, RRBVector a)
600 | viewl Empty = Nothing
601 | viewl v@(Root _ _ tree) =
602 | let tail = drop 1 v
603 | in Just (headTree tree, tail)
605 | headTree : Tree a -> a
606 | headTree (Balanced arr) =
607 | case tryNatToFin 0 of
609 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewl: can't convert Nat to Fin"
611 | assert_total $
headTree (at arr.arr zero)
612 | headTree (Unbalanced arr _) =
613 | case tryNatToFin 0 of
615 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewl: can't convert Nat to Fin"
617 | assert_total $
headTree (at arr.arr zero)
618 | headTree (Leaf arr) =
619 | case tryNatToFin 0 of
621 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewl: can't convert Nat to Fin"
627 | viewr : RRBVector a
628 | -> Maybe (RRBVector a, a)
629 | viewr Empty = Nothing
630 | viewr v@(Root size _ tree) =
631 | let init = take (minus size 1) v
632 | in Just (init, lastTree tree)
634 | lastTree : Tree a -> a
635 | lastTree (Balanced arr) =
636 | case tryNatToFin (minus size 1) of
638 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewr: can't convert Nat to Fin"
640 | assert_total $
lastTree (at arr.arr last)
641 | lastTree (Unbalanced arr _) =
642 | case tryNatToFin (minus size 1) of
644 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewr: can't convert Nat to Fin"
646 | assert_total $
lastTree (at arr.arr last)
647 | lastTree (Leaf arr) =
648 | case tryNatToFin (minus size 1) of
650 | assert_total $
idris_crash "Data.RRBVector.Unsized.viewr: can't convert Nat to Fin"
663 | map _ Empty = Empty
664 | map f (Root size sh tree) = Root size sh (mapTree tree)
666 | mapTree : Tree a -> Tree b
667 | mapTree (Balanced arr) =
668 | assert_total $
Balanced (map mapTree arr)
669 | mapTree (Unbalanced arr sizes) =
670 | assert_total $
Unbalanced (map mapTree arr) sizes
671 | mapTree (Leaf arr) =
676 | reverse : RRBVector a
679 | case compare (length v) 1 of
685 | case fromList $
toList v of
687 | assert_total $
idris_crash "Data.RRBVector.Unsized.reverse: can't convert to List1"
689 | fromList $
forget $
reverse v'
696 | -> RRBVector (a, b)
698 | case fromList $
toList v1 of
700 | assert_total $
idris_crash "Data.RRBVector.Unsized.zip: can't convert to List1"
702 | case fromList $
toList v2 of
704 | assert_total $
idris_crash "Data.RRBVector.Unsized.zip: can't convert to List1"
706 | fromList $
forget $
zip v1' v2'
717 | newBranch x 0 = Leaf (singleton x)
718 | newBranch x sh = assert_total $
Balanced (singleton $
newBranch x (down sh))
725 | x <| Empty = singleton x
726 | x <| Root size sh tree =
727 | case compare insertshift sh of
729 | Root (plus size 1) sh (consTree sh tree)
731 | Root (plus size 1) sh (consTree sh tree)
733 | let new = A 2 $
array $
fromList [(newBranch x sh), tree]
734 | in Root (plus size 1) insertshift (computeSizes insertshift new)
743 | computeShift sz sh min (Balanced _) =
745 | let hishift = let comp = mult (log2 (minus sz 1) `div` blockshift) blockshift
746 | in case compare comp 0 of
753 | hi = (natToInteger $
minus sz 1) `shiftR` hishift
754 | newshift = case compare hi (natToInteger blockmask) of
758 | plus hishift blockshift
760 | plus hishift blockshift
761 | in case compare newshift sh of
768 | computeShift _ sh min (Unbalanced arr sizes) =
769 | let sz' = case tryNatToFin 0 of
771 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).computeShift.Unbalanced: can't convert Nat to Fin"
774 | newtree = case tryNatToFin 0 of
776 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).computeShift.Unbalanced: can't convert Nat to Fin"
779 | newmin = case compare arr.size blocksize of
786 | in assert_total $
computeShift sz' (down sh) newmin newtree
787 | computeShift _ _ min (Leaf arr) =
788 | case compare arr.size blocksize of
796 | insertshift = computeShift size sh (up sh) tree
800 | consTree sh (Balanced arr) =
801 | case compare sh insertshift of
803 | case tryNatToFin 0 of
805 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).consTree.Balanced: can't convert Nat to Fin"
807 | assert_total $
computeSizes sh (A arr.size $
updateAt zero (consTree (down sh)) arr.arr)
809 | computeSizes sh (A (S arr.size) (append (fill 1 (newBranch x (down sh))) arr.arr))
811 | case tryNatToFin 0 of
813 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).consTree.Balanced: can't convert Nat to Fin"
815 | assert_total $
computeSizes sh (A arr.size $
updateAt zero (consTree (down sh)) arr.arr)
816 | consTree sh (Unbalanced arr _) =
817 | case compare sh insertshift of
819 | case tryNatToFin 0 of
821 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).consTree.Unbalanced: can't convert Nat to Fin"
823 | assert_total $
computeSizes sh (A arr.size $
updateAt zero (consTree (down sh)) arr.arr)
825 | computeSizes sh (A (S arr.size) (append (fill 1 (newBranch x (down sh))) arr.arr))
827 | case tryNatToFin 0 of
829 | assert_total $
idris_crash "Data.RRBVector.Unsized.(<|).consTree.Unbalanced: can't convert Nat to Fin"
831 | assert_total $
computeSizes sh (A arr.size $
updateAt zero (consTree (down sh)) arr.arr)
832 | consTree _ (Leaf arr) =
833 | Leaf (A (S arr.size) (append (fill 1 x) arr.arr))
840 | Empty |> x = singleton x
841 | Root size sh tree |> x =
842 | case compare insertshift sh of
844 | Root (plus size 1) sh (snocTree sh tree)
846 | Root (plus size 1) sh (snocTree sh tree)
848 | let new = A 2 $
array $
fromList [tree,(newBranch x sh)]
849 | in Root (plus size 1) insertshift (computeSizes insertshift new)
858 | computeShift sz sh min (Balanced _) =
860 | let newshift = mult (countTrailingZeros sz `div` blockshift) blockshift
861 | in case compare newshift sh of
868 | computeShift _ sh min (Unbalanced arr sizes) =
869 | let lastidx = minus arr.size 1
870 | sz' = case tryNatToFin lastidx of
872 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).computeShift.Unbalanced: can't convert Nat to Fin"
874 | case tryNatToFin $
minus lastidx 1 of
876 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).computeShift.Unbalanced: can't convert Nat to Fin"
878 | minus (at sizes.arr lastidx') (at sizes.arr lastidx'')
879 | newtree = case tryNatToFin lastidx of
881 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).computeShift.Unbalanced: can't convert Nat to Fin"
883 | at arr.arr lastidx'
884 | newmin = case compare arr.size blocksize of
891 | in assert_total $
computeShift sz' (down sh) newmin newtree
892 | computeShift _ _ min (Leaf arr) =
893 | case compare arr.size blocksize of
901 | insertshift = computeShift size sh (up sh) tree
905 | snocTree sh (Balanced arr) =
906 | case compare sh insertshift of
908 | case tryNatToFin $
minus arr.size 1 of
910 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Balanced: can't convert Nat to Fin"
912 | assert_total $
Balanced (A arr.size $
updateAt lastidx (snocTree (down sh)) arr.arr)
914 | Balanced (A (plus arr.size 1) (append arr.arr (fill 1 (newBranch x (down sh)))))
916 | case tryNatToFin $
minus arr.size 1 of
918 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Balanced: can't convert Nat to Fin"
920 | assert_total $
Balanced (A arr.size $
updateAt lastidx (snocTree (down sh)) arr.arr)
921 | snocTree sh (Unbalanced arr sizes) =
922 | case compare sh insertshift of
924 | case tryNatToFin $
minus arr.size 1 of
926 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Unbalanced: can't convert Nat to Fin"
928 | case tryNatToFin $
minus sizes.size 1 of
930 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Unbalanced: can't convert Nat to Fin"
932 | let lastsize = plus (at sizes.arr lastidxs) 1
933 | in assert_total $
Unbalanced (A arr.size (updateAt lastidxa (snocTree (down sh)) arr.arr))
934 | (A sizes.size (setAt lastidxs lastsize sizes.arr))
936 | case tryNatToFin $
minus sizes.size 1 of
938 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Unbalanced: can't convert Nat to Fin"
940 | let lastsize = plus (at sizes.arr lastidx) 1
941 | in assert_total $
Unbalanced (A (plus arr.size 1) (append arr.arr (fill 1 (newBranch x (down sh)))))
942 | (A (plus sizes.size 1) (append sizes.arr (fill 1 lastsize)))
944 | case tryNatToFin $
minus arr.size 1 of
946 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Unbalanced: can't convert Nat to Fin"
948 | case tryNatToFin $
minus sizes.size 1 of
950 | assert_total $
idris_crash "Data.RRBVector.Unsized.(|>).snocTree.Unbalanced: can't convert Nat to Fin"
952 | let lastsize = plus (at sizes.arr lastidxs) 1
953 | in assert_total $
Unbalanced (A arr.size (updateAt lastidxa (snocTree (down sh)) arr.arr))
954 | (A sizes.size (setAt lastidxs lastsize sizes.arr))
955 | snocTree _ (Leaf arr) = Leaf (A (plus arr.size 1) (append arr.arr (fill 1 x)))
964 | Root size1 sh1 tree1 >< Root size2 sh2 tree2 =
965 | let upmaxshift = case compare sh1 sh2 of
972 | newarr = mergeTrees tree1 sh1 tree2 sh2
973 | in normalize $
Root (plus size1 size2) upmaxshift (computeSizes upmaxshift newarr)
975 | viewlArr : Array (Tree a) -> (Tree a, Array (Tree a))
977 | case tryNatToFin 0 of
979 | assert_total $
idris_crash "Data.RRBVector.Unsized.(><).viewlArr: can't convert Nat to Fin"
981 | (at arr.arr zero, drop 1 arr)
982 | viewrArr : Array (Tree b) -> (Array (Tree b), Tree b)
984 | case tryNatToFin $
minus arr.size 1 of
986 | assert_total $
idris_crash "Data.RRBVector.Unsized.(><).viewrArr: can't convert Nat to Fin"
988 | (take (minus arr.size 1) arr, at arr.arr last)
989 | mergeRebalance' : Shift
993 | -> (Tree a -> Array (Tree a))
994 | -> (Array (Tree a) -> Tree a)
996 | mergeRebalance' sh left center right extract construct =
998 | nodecounter <- newSTRef 0
999 | subtreecounter <- newSTRef 0
1000 | newnode <- newSTRef Lin
1001 | newsubtree <- newSTRef Lin
1002 | newroot <- newSTRef Lin
1003 | for_ (toList left ++ toList center ++ toList right) $
\subtree =>
1004 | for_ (extract subtree) $
\x => do
1005 | nodecounter' <- readSTRef nodecounter
1006 | when (nodecounter' == (natToInteger blocksize)) $
do
1007 | newnode' <- readSTRef newnode
1008 | modifySTRef newsubtree (\y => y :< (construct $
A (SnocSize newnode')
1012 | writeSTRef nodecounter 0
1013 | modifySTRef subtreecounter (\y => y + 1
1015 | subtreecounter' <- readSTRef subtreecounter
1016 | when (subtreecounter' == (natToInteger blocksize)) $
do
1017 | newsubtree' <- readSTRef newsubtree
1018 | modifySTRef newroot (\y => y :< (computeSizes sh (fromList $
the (List (Tree a)) (cast newsubtree')))
1020 | writeSTRef newsubtree Lin
1021 | writeSTRef subtreecounter 0
1022 | modifySTRef newnode (\y => y :< (fill 1 x)
1024 | modifySTRef nodecounter (\y => y + 1
1026 | newnode' <- readSTRef newnode
1027 | modifySTRef newsubtree (\y => y :< (construct $
A (SnocSize newnode')
1030 | newsubtree' <- readSTRef newsubtree
1031 | modifySTRef newroot (\y => y :< (computeSizes sh (fromList $
the (List (Tree a)) (cast newsubtree')))
1033 | newroot' <- readSTRef newroot
1034 | pure $
fromList $
the (List (Tree a)) (cast newroot')
1035 | mergeRebalance'' : Shift
1042 | mergeRebalance'' sh left center right extract construct =
1044 | nodecounter <- newSTRef 0
1045 | subtreecounter <- newSTRef 0
1046 | newnode <- newSTRef Lin
1047 | newsubtree <- newSTRef Lin
1048 | newroot <- newSTRef Lin
1049 | for_ (toList left ++ toList center ++ toList right) $
\subtree =>
1050 | for_ (extract subtree) $
\x => do
1051 | nodecounter' <- readSTRef nodecounter
1052 | when (nodecounter' == (natToInteger blocksize)) $
do
1053 | newnode' <- readSTRef newnode
1054 | modifySTRef newsubtree (\y => y :< (construct $
A (SnocSize newnode')
1058 | writeSTRef nodecounter 0
1059 | modifySTRef subtreecounter (\y => y + 1
1061 | subtreecounter' <- readSTRef subtreecounter
1062 | when (subtreecounter' == (natToInteger blocksize)) $
do
1063 | newsubtree' <- readSTRef newsubtree
1064 | modifySTRef newroot (\y => y :< (computeSizes sh (fromList $
the (List (Tree a)) (cast newsubtree')))
1066 | writeSTRef newsubtree Lin
1067 | writeSTRef subtreecounter 0
1068 | modifySTRef newnode (\y => y :< (fill 1 x)
1070 | modifySTRef nodecounter (\y => y + 1
1072 | newnode' <- readSTRef newnode
1073 | modifySTRef newsubtree (\y => y :< (construct $
A (SnocSize newnode')
1076 | newsubtree' <- readSTRef newsubtree
1077 | modifySTRef newroot (\y => y :< (computeSizes sh (fromList $
the (List (Tree a)) (cast newsubtree')))
1079 | newroot' <- readSTRef newroot
1080 | pure $
fromList $
the (List (Tree a)) (cast newroot')
1086 | mergeRebalance sh left center right =
1087 | case compare sh blockshift of
1089 | assert_total $
mergeRebalance' sh left center right treeToArray (computeSizes (down sh))
1091 | assert_total $
mergeRebalance'' sh left center right (\(Leaf arr) => arr) Leaf
1093 | assert_total $
mergeRebalance' sh left center right treeToArray (computeSizes (down sh))
1099 | mergeTrees tree1@(Leaf arr1) _ tree2@(Leaf arr2) _ =
1100 | case compare arr1.size blocksize of
1102 | let arr' = A (plus arr1.size arr2.size) (append arr1.arr arr2.arr)
1103 | in case compare arr'.size blocksize of
1109 | let (left, right) = (take blocksize arr',drop blocksize arr')
1112 | in A 2 $
fromPairs 2 lefttree [(1,righttree)]
1114 | A 2 $
fromPairs 2 tree1 [(1,tree2)]
1116 | let arr' = A (plus arr1.size arr2.size) (append arr1.arr arr2.arr)
1117 | in case compare arr'.size blocksize of
1123 | let (left, right) = (take blocksize arr',drop blocksize arr')
1126 | in A 2 $
fromPairs 2 lefttree [(1,righttree)]
1127 | mergeTrees tree1 sh1 tree2 sh2 =
1128 | case compare sh1 sh2 of
1130 | let right = treeToArray tree2
1131 | (righthead, righttail) = viewlArr right
1132 | merged = assert_total $
mergeTrees tree1 sh1 righthead (down sh2)
1133 | in mergeRebalance sh2 empty merged righttail
1135 | let left = treeToArray tree1
1136 | (leftinit, leftlast) = viewrArr left
1137 | merged = assert_total $
mergeTrees leftlast (down sh1) tree2 sh2
1138 | in mergeRebalance sh1 leftinit merged empty
1140 | let left = treeToArray tree1
1141 | right = treeToArray tree2
1142 | (leftinit, leftlast) = viewrArr left
1143 | (righthead, righttail) = viewlArr right
1144 | merged = assert_total $
mergeTrees leftlast (down sh1) righthead (down sh2)
1145 | in mergeRebalance sh1 leftinit merged righttail
1156 | let (left, right) = splitAt i v
1157 | in (left |> x) >< right
1166 | let (left, right) = splitAt (plus i 1) v
1167 | in take i left >< right
1175 | showRRBVectorRep : Show a
1180 | showRRBVectorRep Empty =
1182 | showRRBVectorRep (Root size sh t) =
1198 | Eq a => Eq (RRBVector a) where
1199 | xs == ys = length xs == length ys && Data.RRBVector.Unsized.toList xs == Data.RRBVector.Unsized.toList ys
1202 | Ord a => Ord (RRBVector a) where
1203 | compare xs ys = compare (Data.RRBVector.Unsized.toList xs) (Data.RRBVector.Unsized.toList ys)
1206 | Functor RRBVector where
1210 | Foldable RRBVector where
1211 | foldl f z = Data.RRBVector.Unsized.foldl f z
1212 | foldr f z = Data.RRBVector.Unsized.foldr f z
1216 | Applicative RRBVector where
1218 | fs <*> xs = Data.RRBVector.Unsized.foldl (\acc, f => acc >< map f xs) empty fs
1221 | Semigroup (RRBVector a) where
1225 | Semigroup (RRBVector a) => Monoid (RRBVector a) where
1230 | xs >>= f = Data.RRBVector.Unsized.foldl (\acc, x => acc >< f x) empty xs