3 | import public Data.Set.Internal
28 | foldl : (a -> b -> a)
34 | foldl f z (Bin _ x l r) =
35 | foldl f (f (foldl f z l) x) r
39 | foldr : (a -> b -> b)
45 | foldr f z (Bin _ x l r) =
46 | foldr f (f x (foldr f z r)) l
69 | go orig x t@(Bin sz y l r) =
72 | let l' = go orig x l
79 | let r' = go orig x r
106 | go orig x t@(Bin _ y l r) =
107 | case compare x y of
109 | let l' = go orig x l
116 | let r' = go orig x r
144 | go x t@(Bin _ y l r) =
145 | case compare x y of
175 | member x (Bin _ y l r) =
176 | case compare x y of
206 | goJust _ best Tip =
208 | goJust x best (Bin _ y l r) =
219 | goNothing x (Bin _ y l r) =
239 | goJust _ best Tip =
241 | goJust x best (Bin _ y l r) =
252 | goNothing x (Bin _ y l r) =
272 | goJust _ best Tip =
274 | goJust x best (Bin _ y l r) =
275 | case compare x y of
287 | goNothing x (Bin _ y l r) =
288 | case compare x y of
309 | goJust _ best Tip =
311 | goJust x best (Bin _ y l r) =
312 | case compare x y of
324 | goNothing x (Bin _ y l r) =
325 | case compare x y of
345 | splitMember : Ord a
348 | -> (Set a, Bool, Set a)
349 | splitMember _ Tip =
351 | splitMember x (Bin _ y l r) =
352 | case compare x y of
354 | let (lt, found, gt) = splitMember x l
356 | in (lt, found, gt')
358 | let (lt, found, gt) = splitMember x r
360 | in (lt', found, gt)
374 | [l, singleton v, r]
386 | split x (Bin _ y l r) =
387 | case compare x y of
389 | let (lt, gt) = split x l
390 | in (lt, link y gt r)
392 | let (lt, gt) = split x r
393 | in (link y l lt, gt)
398 | isSubsetOfX : Ord a
402 | isSubsetOfX Tip _ =
404 | isSubsetOfX _ Tip =
406 | isSubsetOfX (Bin 1 x _ _) t =
408 | isSubsetOfX (Bin _ x l r) t =
409 | let (lt, found, gt) = splitMember x t
411 | size l <= size lt &&
412 | size r <= size gt &&
413 | isSubsetOfX l lt &&
423 | size t1 <= size t2 && isSubsetOfX t1 t2
427 | isProperSubsetOf : Ord a
431 | isProperSubsetOf s1 s2 =
432 | size s1 <= size s2 && isSubsetOfX s1 s2
444 | disjoint (Bin 1 x _ _) t =
446 | disjoint (Bin _ x l r) t =
447 | let (lt, found, gt) = splitMember x t
465 | merge l@(Bin sizeL x lx rx) r@(Bin sizeR y ly ry) =
466 | case delta * sizeL < sizeR of
468 | balanceL y (merge l ly) ry
470 | case delta*sizeR < sizeL of
472 | balanceR x lx (merge rx r)
482 | filter : Eq (Set a)
488 | filter p t@(Bin _ x l r) =
491 | case l == (filter p l) && r == (filter p r) of
495 | link x (filter p l) (filter p r)
497 | merge (filter p l) (filter p r)
503 | partition : Eq (Set a)
509 | partition p t@(Bin _ x l r) =
510 | case (partition p l, partition p r) of
511 | ((l1, l2), (r1, r2)) =>
514 | case l1 == l && r1 == r of
518 | (link x l1 r1, merge l2 r2)
520 | case l2 == l && r2 == r of
524 | (merge l1 r1, link x l2 r2)
530 | takeWhileAntitone : (a -> Bool)
533 | takeWhileAntitone _ Tip =
535 | takeWhileAntitone p (Bin _ x l r) =
538 | link x l (takeWhileAntitone p r)
540 | takeWhileAntitone p l
546 | dropWhileAntitone : (a -> Bool)
549 | dropWhileAntitone _ Tip =
551 | dropWhileAntitone p (Bin _ x l r) =
554 | dropWhileAntitone p r
556 | link x (dropWhileAntitone p l) r
562 | spanAntitone : (a -> Bool)
565 | spanAntitone p0 s =
573 | go p (Bin _ x l r) =
576 | let (u, v) = go p r
579 | let (u, v) = go p l
590 | lookupIndex : Ord a
603 | go idx x (Bin _ kx l r) =
604 | case compare x kx of
608 | go (idx + size l + 1) x r
610 | Just $
idx + size l
629 | assert_total $
idris_crash "Data.Set.findIndex: element is not in the set"
630 | go idx x (Bin _ kx l r) =
631 | case compare x kx of
635 | go (idx + size l + 1) x r
647 | assert_total $
idris_crash "Data.Set.elemAt: index out of range"
648 | elemAt i (Bin _ x l r) =
649 | case compare i (size l) of
653 | elemAt ((i `minus` (size l)) `minus` 1) r
667 | assert_total $
idris_crash "Data.Set.deleteAt: index out of range"
669 | case compare i (size l) of
671 | balanceR x (deleteAt i l) r
673 | balanceL x l (deleteAt ((i `minus` (size l)) `minus` 1) r)
684 | case i >= size s of
695 | go i (Bin _ x l r) =
700 | case compare i (size l) of
704 | link x l (go ((i `minus` (size l)) `minus` 1) r)
715 | case i >= size s of
726 | go i s@(Bin _ x l r) =
731 | case compare i (size l) of
735 | go ((i `minus` (size l)) `minus` 1) r
745 | case i >= size s of
756 | go i s@(Bin _ x l r) =
761 | case compare i (size l) of
767 | case go ((i `minus` (size l)) `minus` 1) r of
781 | lookupMinSure x Tip =
783 | lookupMinSure _ (Bin _ x l _) =
792 | lookupMin (Bin _ x l _) =
793 | Just $
lookupMinSure x l
799 | lookupMaxSure x Tip =
801 | lookupMaxSure _ (Bin _ x _ r) =
810 | lookupMax (Bin _ x _ r) =
811 | Just $
lookupMaxSure x r
818 | case lookupMin t of
822 | assert_total $
idris_crash "Data.Set.findMin: empty set has no minimal element"
829 | case lookupMax t of
833 | assert_total $
idris_crash "Data.Set.findMax: empty set has no maximal element"
841 | deleteMin (Bin _ _ Tip r) =
843 | deleteMin (Bin _ x l r) =
844 | balanceR x (deleteMin l) r
852 | deleteMax (Bin _ _ l Tip) =
854 | deleteMax (Bin _ x l r) =
855 | balanceL x l (deleteMax r)
861 | -> Maybe (a, Set a)
864 | minView (Bin _ x l r) =
865 | Just $
minViewSure x l r
869 | deleteFindMin : Set a
876 | (assert_total $
idris_crash "Data.Set.deleteFindMin: can not return the minimal element of an empty set", Tip)
882 | -> Maybe (a, Set a)
885 | maxView (Bin _ x l r) =
886 | Just $
maxViewSure x l r
890 | deleteFindMax : Set a
897 | (assert_total $
idris_crash "Data.Set.deleteFindMax: can not return the maximal element of an empty set", Tip)
914 | union t1 (Bin 1 x _ _) =
916 | union (Bin 1 x _ _) t2 =
920 | union t1@(Bin _ x l1 r1) t2 =
921 | let (l2,r2) = split x t2
924 | in case l1l2 == l1 && r1r2 == r1 of
943 | difference t1 Tip =
945 | difference t1 (Bin _ x l2 r2) =
946 | let (l1, r1) = split x t1
947 | l1l2 = difference l1 l2
948 | r1r2 = difference r1 r2
949 | in case size l1l2 + size r1r2 == size t1 of
971 | intersection : Eq (Set a)
976 | intersection Tip _ =
978 | intersection _ Tip =
980 | intersection t1@(Bin _ x l1 r1) t2 =
981 | let (l2,x',r2) = splitMember x t2
982 | l1l2 = intersection l1 l2
983 | r1r2 = intersection r1 r2
986 | case l1l2 == l1 && r1r2 == r1 of
1004 | toDescList t@(Bin _ _ _ _) =
1005 | foldl (\xs, x => x :: xs) [] t
1013 | toAscList t@(Bin _ _ _ _) =
1014 | foldr (\x, xs => x :: xs) [] t
1036 | case notOrdered x0 xs0 of
1038 | fromList' (Bin 1 x0 Tip Tip) xs0
1040 | go 1 (Bin 1 x0 Tip Tip) xs0
1047 | notOrdered x (y :: _) =
1053 | foldl (\t, x => insert x t) t0 xs
1056 | -> (Set a, List a, List a)
1059 | create s xs@(x :: xss) =
1062 | case notOrdered x xss of
1064 | (Bin 1 x Tip Tip, [], xss)
1066 | (Bin 1 x Tip Tip, xss, [])
1068 | let create' = assert_total $
create (integerToNat ((natToInteger s) `shiftR` 1)) xs
1073 | (insertMax y l, [], zs)
1074 | (l , ys@(y :: yss), _) =>
1075 | case notOrdered y yss of
1079 | let (r, zs, ws) = assert_total $
create (integerToNat ((natToInteger s) `shiftR` 1)) yss
1080 | in (link y l r, zs, ws)
1090 | case notOrdered x xss of
1094 | let create' = assert_total $
create s xss
1097 | assert_total $
go (integerToNat ((natToInteger s) `shiftL` 1)) (link x l r) ys
1099 | fromList' (link x l r) ys
1113 | Bin sz (f x) (map f l) (map f r)
1125 | merge (map Left as) (map Right bs)
1136 | Show (List a) => Show (Set a) where
1137 | show s = "fromList " ++ (show $
toList s)