3 | import public Data.Map.Internal
28 | foldl : (v -> w -> v)
34 | foldl f z (Bin _ _ x l r) =
35 | foldl f (f (foldl f z l) x) r
39 | foldr : (v -> w -> w)
45 | foldr f z (Bin _ _ x l r) =
46 | foldr f (f x (foldr f z r)) l
50 | foldlWithKey : (v -> k -> w -> v)
54 | foldlWithKey f z Tip =
56 | foldlWithKey f z (Bin _ kx x l r) =
57 | foldlWithKey f (f (foldlWithKey f z l) kx x) r
61 | foldrWithKey : (k -> v -> w -> w)
65 | foldrWithKey f z Tip =
67 | foldrWithKey f z (Bin _ kx x l r) =
68 | foldrWithKey f (f kx x (foldrWithKey f z r)) l
78 | insert : Eq (Map k v)
95 | go orig kx x t@(Bin sz ky y l r) =
96 | case compare kx ky of
98 | let l' = go orig kx x l
105 | let r' = go orig kx x r
112 | case (x == y && orig == ky) of
119 | insertR : Eq (Map k v)
136 | go orig kx x t@(Bin _ ky y l r) =
137 | case compare kx ky of
139 | let l' = go orig kx x l
146 | let r' = go orig kx x r
177 | go f kx x (Bin sy ky y l r) =
178 | case compare kx ky of
180 | balanceL ky y (go f kx x l) r
182 | balanceR ky y l (go f kx x r)
184 | Bin sy kx (f x y) l r
187 | insertWithR : Ord k
203 | go f kx x (Bin sy ky y l r) =
204 | case compare kx ky of
206 | balanceL ky y (go f kx x l) r
208 | balanceR ky y l (go f kx x r)
210 | Bin sy ky (f y x) l r
213 | insertWithKeyR : Ord k
214 | => (k -> v -> v -> v)
222 | go : (k -> v -> v -> v)
229 | go f kx x (Bin sy ky y l r) =
230 | case compare kx ky of
232 | balanceL ky y (go f kx x l) r
234 | balanceR ky y l (go f kx x r)
236 | Bin sy ky (f ky y x) l r
244 | insertWithKey : Ord k
245 | => (k -> v -> v -> v)
253 | go : (k -> v -> v -> v)
260 | go f kx x (Bin sy ky y l r) =
261 | case compare kx ky of
263 | balanceL ky y (go f kx x l) r
265 | balanceR ky y l (go f kx x r)
267 | Bin sy kx (f kx x y) l r
274 | insertLookupWithKey : Ord k
275 | => (k -> v -> v -> v)
279 | -> (Maybe v, Map k v)
280 | insertLookupWithKey f0 k0 x0 =
283 | go : (k -> a -> a -> a)
287 | -> (Maybe a, Map k a)
289 | (Nothing, singleton kx x)
290 | go f kx x (Bin sy ky y l r) =
291 | case compare kx ky of
293 | let (found, l') = go f kx x l
294 | t' = balanceL ky y l' r
297 | let (found, r') = go f kx x r
298 | t' = balanceR ky y l r'
301 | (Just y, Bin sy kx (f kx x y) l r)
310 | delete : Eq (Map k v)
324 | go k t@(Bin _ kx x l r) =
325 | case compare k kx of
346 | adjustWithKey : Ord k
360 | go f k (Bin sx kx x l r) =
361 | case compare k kx of
363 | Bin sx kx x (go f k l) r
365 | Bin sx kx x l (go f k r)
367 | Bin sx kx (f kx x) l r
378 | adjustWithKey (\_, x => f x)
385 | updateWithKey : Ord k
386 | => (k -> v -> Maybe v)
393 | go : (k -> v -> Maybe v)
399 | go f k (Bin sx kx x l r) =
400 | case compare k kx of
402 | balanceR kx x (go f k l) r
404 | balanceL kx x l (go f k r)
422 | updateWithKey (\_, x => f x)
428 | updateLookupWithKey : Ord k
429 | => (k -> v -> Maybe v)
432 | -> (Maybe v, Map k v)
433 | updateLookupWithKey f0 k0 =
436 | go : (k -> v -> Maybe v)
439 | -> (Maybe v, Map k v)
442 | go f k (Bin sx kx x l r) =
443 | case compare k kx of
445 | let (found, l') = go f k l
446 | t' = balanceR kx x l' r
449 | let (found, r') = go f k r
450 | t' = balanceL kx x l r'
455 | (Just x', Bin sx kx x' l r)
457 | let glued = glue l r
464 | => (Maybe v -> Maybe v)
471 | go : (Maybe v -> Maybe v)
481 | go f k (Bin sx kx x l r) =
482 | case compare k kx of
484 | balance kx x (go f k l) r
486 | balance kx x l (go f k r)
514 | go k (Bin _ kx x l r) =
515 | case compare k kx of
541 | member k (Bin _ kx _ l r) =
542 | case compare k kx of
568 | assert_total $
idris_crash "Data.Map.find: given key is not an element in the map"
569 | find k (Bin _ kx x l r) =
570 | case compare k kx of
592 | findWithDefault : Ord k
597 | findWithDefault def _ Tip =
599 | findWithDefault def k (Bin _ kx x l r) =
600 | case compare k kx of
602 | findWithDefault def k l
604 | findWithDefault def k r
623 | goJust _ kx' x' Tip =
625 | goJust k kx' x' (Bin _ kx x l r) =
636 | goNothing k (Bin _ kx x l r) =
658 | goJust _ kx' x' Tip =
660 | goJust k kx' x' (Bin _ kx x l r) =
671 | goNothing k (Bin _ kx x l r) =
693 | goJust _ kx' x' Tip =
695 | goJust k kx' x' (Bin _ kx x l r) =
696 | case compare k kx of
708 | goNothing k (Bin _ kx x l r) =
709 | case compare k kx of
732 | goJust _ kx' x' Tip =
734 | goJust k kx' x' (Bin _ kx x l r) =
735 | case compare k kx of
747 | goNothing k (Bin _ kx x l r) =
748 | case compare k kx of
774 | splitMember : Ord k
777 | -> (Map k v, Bool, Map k v)
783 | -> (Map k v, Bool, Map k v)
789 | case compare k kx of
791 | let (lt, z, gt) = go k l
792 | in (lt, z, link kx x gt r)
794 | let (lt, z, gt) = go k r
795 | in (link kx x l lt, z, gt)
802 | splitRoot : Map k v
809 | [l, singleton k v, r]
814 | splitLookup : Ord k
817 | -> (Map k v, Maybe v, Map k v)
823 | -> (Map k v, Maybe v, Map k v)
827 | (Tip, Nothing, Tip)
829 | case compare k kx of
831 | let (lt,z,gt) = go k l
832 | in (lt,z,link kx x gt r)
834 | let (lt,z,gt) = go k r
835 | in (link kx x l lt, z, gt)
846 | -> (Map k v, Map k v)
852 | -> (Map k v, Map k v)
858 | case compare k kx of
860 | let (lt, gt) = go k l
861 | in (lt, link kx x gt r)
863 | let (lt, gt) = go k r
864 | in (link kx x l lt, gt)
870 | filterWithKey : Eq (Map k v)
871 | => (k -> v -> Bool)
874 | filterWithKey _ Tip =
876 | filterWithKey p t@(Bin _ kx x l r) =
879 | case (filterWithKey p l) == l && (filterWithKey p r) == r of
883 | link kx x (filterWithKey p l) (filterWithKey p r)
885 | link2 (filterWithKey p l) (filterWithKey p r)
889 | filter : Eq (Map k v)
894 | filterWithKey (\_, x => p x) m
900 | partitionWithKey : Eq (Map k v)
901 | => (k -> v -> Bool)
903 | -> (Map k v, Map k v)
904 | partitionWithKey p0 t0 =
907 | go : (k -> v -> Bool)
909 | -> (Map k v, Map k v)
912 | go p t@(Bin _ kx x l r) =
915 | ( case (fst $
go p l) == l && (fst $
go p r) == r of
919 | link kx x (fst $
go p l) (fst $
go p r)
920 | , link2 (snd $
go p l) (snd $
go p r)
923 | ( link2 (fst $
go p l) (fst $
go p r)
924 | , case (snd $
go p l) == l && (snd $
go p r) == r of
928 | link kx x (snd $
go p l) (snd $
go p r)
935 | takeWhileAntitone : (k -> Bool)
938 | takeWhileAntitone _ Tip =
940 | takeWhileAntitone p (Bin _ kx x l r) =
943 | link kx x l (takeWhileAntitone p r)
945 | takeWhileAntitone p l
951 | dropWhileAntitone : (k -> Bool)
954 | dropWhileAntitone _ Tip =
956 | dropWhileAntitone p (Bin _ kx x l r) =
959 | dropWhileAntitone p r
961 | link kx x (dropWhileAntitone p l) r
967 | spanAntitone : (k -> Bool)
969 | -> (Map k v, Map k v)
970 | spanAntitone p0 m =
975 | -> (Map k v, Map k v)
978 | go p (Bin _ kx x l r) =
981 | let (u, v) = go p r
982 | in (link kx x l u, v)
984 | let (u, v) = go p l
985 | in (u, link kx x v r)
989 | mapMaybeWithKey : (k -> a -> Maybe b)
992 | mapMaybeWithKey _ Tip =
994 | mapMaybeWithKey f (Bin _ kx x l r) =
997 | link kx y (mapMaybeWithKey f l) (mapMaybeWithKey f r)
999 | link2 (mapMaybeWithKey f l) (mapMaybeWithKey f r)
1003 | mapMaybe : (a -> Maybe b)
1007 | mapMaybeWithKey (\_, x => f x)
1011 | mapEitherWithKey : (k -> a -> Either b c)
1014 | mapEitherWithKey f0 t0 =
1017 | go : (k -> a -> Either b c)
1022 | go f (Bin _ kx x l r) =
1025 | (link kx y (fst $
go f l) (fst $
go f r), link2 (snd $
go f l) (snd $
go f r))
1027 | (link2 (fst $
go f l) (fst $
go f r), link kx z (snd $
go f l) (snd $
go f r))
1031 | mapEither : (a -> Either b c)
1035 | mapEitherWithKey (\_, x => f x) m
1051 | submap' f (Bin 1 kx x _ _) t =
1057 | submap' f (Bin _ kx x l r) t =
1058 | let (lt,found,gt) = splitLookup kx t
1063 | f x y && size l <= size lt
1078 | size t1 <= size t2 && submap' f t1 t2
1088 | isSubmapOfBy (==) m1 m2
1096 | isProperSubmapOfBy : Ord k
1101 | isProperSubmapOfBy f t1 t2 =
1102 | size t1 < size t2 && submap' f t1 t2
1107 | isProperSubmapOf : Eq v
1112 | isProperSubmapOf m1 m2 =
1113 | isProperSubmapOfBy (==) m1 m2
1136 | go idx k (Bin _ kx _ l r) =
1141 | go (idx + size l + 1) k r
1162 | assert_total $
idris_crash "Data.Map.findIndex: element is not in the map"
1163 | go idx k (Bin _ kx _ l r) =
1168 | go (idx + size l + 1) k r
1180 | assert_total $
idris_crash "Data.Map.elemAt: index out of range"
1181 | elemAt i (Bin _ kx x l r) =
1182 | case compare i (size l) of
1186 | elemAt ((i `minus` (size l)) `minus` 1) r
1194 | updateAt : (k -> v -> Maybe v)
1201 | assert_total $
idris_crash "Data.Map.updateAt: index out of range"
1203 | case compare i (size l) of
1205 | balanceR kx x (updateAt f i l) r
1207 | balanceL kx x l (updateAt f ((i `minus` (size l)) `minus` 1) r)
1225 | assert_total $
idris_crash "Data.Map.deleteAt: index out of range"
1227 | case compare i (size l) of
1229 | balanceR kx x (deleteAt i l) r
1231 | balanceL kx x l (deleteAt ((i `minus` (size l)) `minus` 1) r)
1253 | go i (Bin _ kx x l r) =
1258 | case compare i (size l) of
1262 | link kx x l (go ((i `minus` (size l)) `minus` 1) r)
1284 | go i (Bin _ kx x l r) =
1289 | case compare i (size l) of
1293 | go ((i `minus` (size l)) `minus` 1) r
1314 | go i (Bin _ kx x l r) =
1319 | case compare i (size l) of
1325 | case go ((i `minus` (size l)) `minus` 1) r of
1340 | lookupMinSure k v Tip =
1342 | lookupMinSure _ _ (Bin _ k v l _) =
1351 | lookupMin (Bin _ k v l _) =
1352 | Just $
lookupMinSure k v l
1359 | lookupMaxSure k v Tip =
1361 | lookupMaxSure _ _ (Bin _ k v _ r) =
1370 | lookupMax (Bin _ k v _ r) =
1371 | Just $
lookupMaxSure k v r
1382 | assert_total $
idris_crash "Data.Map.findMin: empty map has no minimal element"
1393 | assert_total $
idris_crash "Data.Map.findMax: empty map has no maximal element"
1401 | deleteMin (Bin _ _ _ Tip r) =
1403 | deleteMin (Bin _ kx x l r) =
1404 | balanceR kx x (deleteMin l) r
1412 | deleteMax (Bin _ _ _ l Tip) =
1414 | deleteMax (Bin _ kx x l r) =
1415 | balanceL kx x l (deleteMax r)
1420 | minViewWithKey : Map k v
1421 | -> Maybe ((k, v), Map k v)
1424 | minViewWithKey (Bin _ k x l r) =
1426 | case minViewSure k x l r of
1432 | deleteFindMin : Map k v
1435 | case minViewWithKey t of
1439 | (assert_total $
idris_crash "Data.Map.deleteFindMin: can not return the minimal element of an empty map", Tip)
1444 | maxViewWithKey : Map k v
1445 | -> Maybe ((k, v), Map k v)
1448 | maxViewWithKey (Bin _ k x l r) =
1450 | case maxViewSure k x l r of
1456 | deleteFindMax : Map k v
1459 | case maxViewWithKey t of
1463 | (assert_total $
idris_crash "Data.Map.deleteFindMax: can not return the maximal element of an empty map", Tip)
1467 | updateMinWithKey : (k -> v -> Maybe v)
1470 | updateMinWithKey _ Tip =
1472 | updateMinWithKey f (Bin sx kx x Tip r) =
1475 | Just x' => Bin sx kx x' Tip r
1476 | updateMinWithKey f (Bin _ kx x l r) =
1477 | balanceR kx x (updateMinWithKey f l) r
1481 | updateMin : (v -> Maybe v)
1485 | updateMinWithKey (\_, x => f x) m
1489 | updateMaxWithKey : (k -> v -> Maybe v)
1492 | updateMaxWithKey _ Tip =
1494 | updateMaxWithKey f (Bin sx kx x l Tip) =
1500 | updateMaxWithKey f (Bin _ kx x l r) =
1501 | balanceL kx x l (updateMaxWithKey f r)
1505 | updateMax : (v -> Maybe v)
1509 | updateMaxWithKey (\_, x => f x) m
1517 | case minViewWithKey t of
1529 | case maxViewWithKey t of
1550 | union t1 (Bin _ k x Tip Tip) =
1552 | union (Bin _ k x Tip Tip) t2 =
1556 | union t1@(Bin _ k1 x1 l1 r1) t2 =
1557 | let (l2, r2) = split k1 t2
1558 | in case (union l1 l2) == l1 && (union r1 r2) == r1 of
1562 | link k1 x1 (union l1 l2) (union r1 r2)
1573 | unionWith f t1 (Bin _ k x Tip Tip) =
1575 | unionWith f (Bin _ k x Tip Tip) t2 =
1579 | unionWith f (Bin _ k1 x1 l1 r1) t2 =
1580 | let (l2, mb, r2) = splitLookup k1 t2
1583 | link k1 x1 (unionWith f l1 l2) (unionWith f r1 r2)
1585 | link k1 (f x1 x2) (unionWith f l1 l2) (unionWith f r1 r2)
1594 | unionWithKey _ t1 Tip =
1596 | unionWithKey f t1 (Bin _ k x Tip Tip) =
1597 | insertWithKeyR f k x t1
1598 | unionWithKey f (Bin _ k x Tip Tip) t2 =
1600 | unionWithKey _ Tip t2 =
1602 | unionWithKey f (Bin _ k1 x1 l1 r1) t2 =
1603 | let (l2, mb, r2) = splitLookup k1 t2
1606 | link k1 x1 (unionWithKey f l1 l2) (unionWithKey f r1 r2)
1608 | link k1 (f k1 x1 x2) (unionWithKey f l1 l2) (unionWithKey f r1 r2)
1623 | unionsWith : Foldable f
1629 | foldl (unionWith f) empty ts
1646 | difference t1 (Bin _ k _ l2 r2) =
1647 | let (l1, r1) = split k t1
1648 | in case size (difference l1 l2) + size (difference r1 r2) == size t1 of
1652 | link2 (difference l1 l2) (difference r1 r2)
1670 | intersection : Eq (Map k a)
1679 | intersection t1@(Bin _ k x l1 r1) t2 =
1680 | case splitMember k t2 of
1682 | case (intersection l1 l2) == l1 && (intersection r1 r2) == r1 of
1686 | link k x (intersection l1 l2) (intersection r1 r2)
1688 | link2 (intersection l1 l2) (intersection r1 r2)
1692 | intersectionWith : Ord k
1697 | intersectionWith f Tip _ =
1699 | intersectionWith f _ Tip =
1701 | intersectionWith f (Bin _ k x1 l1 r1) t2 =
1702 | case splitLookup k t2 of
1704 | link k (f x1 x2) (intersectionWith f l1 l2) (intersectionWith f r1 r2)
1706 | link2 (intersectionWith f l1 l2) (intersectionWith f r1 r2)
1710 | intersectionWithKey : Ord k
1715 | intersectionWithKey f Tip _ =
1717 | intersectionWithKey f _ Tip =
1719 | intersectionWithKey f (Bin _ k x1 l1 r1) t2 =
1720 | case splitLookup k t2 of
1722 | link k (f k x1 x2) (intersectionWithKey f l1 l2) (intersectionWithKey f r1 r2)
1724 | link2 (intersectionWithKey f l1 l2) (intersectionWithKey f r1 r2)
1741 | disjoint (Bin 1 k _ _ _) t =
1743 | disjoint (Bin _ k _ l r) t =
1744 | let (lt,found,gt) = splitMember k t
1745 | in not found && disjoint l lt && disjoint r gt
1777 | map f (Bin sx kx x l r) =
1778 | Bin sx kx (f x) (map f l) (map f r)
1782 | mapWithKey : (k -> v -> w)
1787 | mapWithKey f (Bin sx kx x l r) =
1788 | Bin sx kx (f kx x) (mapWithKey f l) (mapWithKey f r)
1793 | mapAccumL : (v -> k -> w -> (v, c))
1799 | mapAccumL f a (Bin sx kx x l r) =
1800 | let (a1, l') = mapAccumL f a l
1802 | (a3, r') = mapAccumL f a2 r
1803 | in (a3, Bin sx kx x' l' r')
1808 | mapAccumRWithKey : (v -> k -> w -> (v, c))
1812 | mapAccumRWithKey _ a Tip =
1814 | mapAccumRWithKey f a (Bin sx kx x l r) =
1815 | let (a1, r') = mapAccumRWithKey f a r
1817 | (a3, l') = mapAccumRWithKey f a2 l
1818 | in (a3, Bin sx kx x' l' r')
1823 | mapAccumWithKey : (v -> k -> w -> (v, c))
1827 | mapAccumWithKey f a t =
1833 | mapAccum : (v -> w -> (v, c))
1838 | mapAccumWithKey (\a', _, x' => f a' x') a m
1850 | toDescList t@(Bin _ _ _ _ _) =
1851 | foldlWithKey (\xs, k, x => (k,x) :: xs) [] t
1859 | toAscList t@(Bin _ _ _ _ _) =
1860 | foldrWithKey (\k, x, xs => (k,x) :: xs) [] t
1881 | fromList ((kx, x) :: []) =
1883 | fromList ((kx0, x0) :: xs0) =
1884 | case notOrdered kx0 xs0 of
1886 | fromList' (Bin 1 kx0 x0 Tip Tip) xs0
1888 | go 1 (Bin 1 kx0 x0 Tip Tip) xs0
1896 | notOrdered kx ((ky, _) :: _) =
1902 | foldl (\t, (k, x) => insert k x t) t0 xs
1905 | -> (Map k v, List (k, v), List (k, v))
1908 | create s xs@((kx, x) :: xss) =
1911 | case notOrdered kx xss of
1913 | (Bin 1 kx x Tip Tip, [], xss)
1915 | (Bin 1 kx x Tip Tip, xss, [])
1917 | let create' = assert_total $
create (integerToNat ((natToInteger s) `shiftR` 1)) xs
1921 | (l , [(ky, y)] , zs) =>
1922 | (insertMax ky y l, [], zs)
1923 | (l , ys@((ky, y) :: yss), _) =>
1924 | case notOrdered ky yss of
1928 | let (r, zs, ws) = assert_total $
create (integerToNat ((natToInteger s) `shiftR` 1)) yss
1929 | in (link ky y l r, zs, ws)
1936 | go _ t ((kx, x) :: []) =
1938 | go s l xs@((kx, x) :: xss) =
1939 | case notOrdered kx xss of
1945 | assert_total $
go (integerToNat ((natToInteger s) `shiftL` 1)) (link kx x l r) ys
1947 | fromList' (link kx x l r) ys
1982 | foldl f z = foldl f z . values
1983 | foldr f z = foldr f z . values
1987 | Show k => Show v => Show (List (k, v)) where
1988 | show xs = "[" ++ show' xs ++ "]"
1990 | show'' : (k, v) -> String
1991 | show'' (k, v) = "(" ++ show k ++ ", " ++ show v ++ ")"
1992 | show' : List (k, v) -> String
1994 | show' (x :: Nil) = show'' x
1995 | show' (x :: xs) = show'' x ++ ", " ++ show' xs
1998 | Show (List (k, v)) => Show (Map k v) where
1999 | show m = "fromList " ++ (show $
toList m)