@@ -4,10 +4,14 @@ module Data.Map
44 singleton ,
55 insert ,
66 lookup ,
7+ member ,
78 delete ,
89 alter ,
10+ update ,
911 toList ,
1012 fromList ,
13+ keys ,
14+ values ,
1115 union ,
1216 unions ,
1317 map
@@ -35,23 +39,26 @@ empty = Leaf
3539singleton :: forall k v . k -> v -> Map k v
3640singleton k v = Branch { key: k, value: v, left: empty, right: empty }
3741
38- insert :: forall k v . (P.Eq k , P. Ord k ) => k -> v -> Map k v -> Map k v
42+ insert :: forall k v . (P.Ord k ) => k -> v -> Map k v -> Map k v
3943insert k v Leaf = singleton k v
4044insert k v (Branch b@{ key = k1 }) | k P .== k1 = Branch (b { key = k, value = v })
4145insert k v (Branch b@{ key = k1 }) | k P .< k1 = Branch (b { left = insert k v b.left })
4246insert k v (Branch b) = Branch (b { right = insert k v b.right })
4347
44- lookup :: forall k v . (P.Eq k , P. Ord k ) => k -> Map k v -> Maybe v
48+ lookup :: forall k v . (P.Ord k ) => k -> Map k v -> Maybe v
4549lookup k Leaf = Nothing
4650lookup k (Branch { key = k1, value = v }) | k P .== k1 = Just v
4751lookup k (Branch { key = k1, left = left }) | k P .< k1 = lookup k left
4852lookup k (Branch { right = right }) = lookup k right
4953
54+ member :: forall k v . (P.Ord k ) => k -> Map k v -> Boolean
55+ member k m = isJust (k `lookup` m)
56+
5057findMinKey :: forall k v . (P.Ord k ) => Map k v -> Tuple k v
5158findMinKey (Branch { key = k, value = v, left = Leaf }) = Tuple k v
5259findMinKey (Branch b) = findMinKey b.left
5360
54- delete :: forall k v . (P.Eq k , P. Ord k ) => k -> Map k v -> Map k v
61+ delete :: forall k v . (P.Ord k ) => k -> Map k v -> Map k v
5562delete k Leaf = Leaf
5663delete k (Branch b@{ key = k1, left = Leaf }) | k P .== k1 =
5764 case b of
@@ -61,7 +68,7 @@ delete k (Branch b@{ key = k1, left = Leaf }) | k P.== k1 =
6168delete k (Branch b@{ key = k1 }) | k P .< k1 = Branch (b { left = delete k b.left })
6269delete k (Branch b) = Branch (b { right = delete k b.right })
6370
64- alter :: forall k v . (P.Eq k , P. Ord k ) => (Maybe v -> Maybe v ) -> k -> Map k v -> Map k v
71+ alter :: forall k v . (P.Ord k ) => (Maybe v -> Maybe v ) -> k -> Map k v -> Map k v
6572alter f k Leaf = case f Nothing of
6673 Nothing -> Leaf
6774 Just v -> singleton k v
@@ -71,7 +78,10 @@ alter f k (Branch b@{ key = k1, value = v }) | k P.== k1 = case f (Just v) of
7178alter f k (Branch b@{ key = k1 }) | k P .< k1 = Branch (b { left = alter f k b.left })
7279alter f k (Branch b) = Branch (b { right = alter f k b.right })
7380
74- glue :: forall k v . (P.Eq k , P.Ord k ) => Map k v -> Map k v -> Map k v
81+ update :: forall k v . (P.Ord k ) => (v -> Maybe v ) -> k -> Map k v -> Map k v
82+ update f k m = alter (maybe Nothing f) k m
83+
84+ glue :: forall k v . (P.Ord k ) => Map k v -> Map k v -> Map k v
7585glue left right =
7686 case findMinKey right of
7787 Tuple minKey root -> Branch { key: minKey, value: root, left: left, right: delete minKey right }
@@ -80,15 +90,23 @@ toList :: forall k v. Map k v -> [Tuple k v]
8090toList Leaf = []
8191toList (Branch b) = toList b.left P .++ [Tuple b.key b.value] P .++ toList b.right
8292
83- fromList :: forall k v . (P.Eq k , P. Ord k ) => [Tuple k v ] -> Map k v
93+ fromList :: forall k v . (P.Ord k ) => [Tuple k v ] -> Map k v
8494fromList = foldl (\m (Tuple k v) -> insert k v m) empty
8595
86- union :: forall k v . (P.Eq k , P.Ord k ) => Map k v -> Map k v -> Map k v
96+ keys :: forall k v . Map k v -> [k ]
97+ keys Leaf = []
98+ keys (Branch b) = keys b.left P .++ [b.key] P .++ keys b.right
99+
100+ values :: forall k v . Map k v -> [v ]
101+ values Leaf = []
102+ values (Branch b) = values b.left P .++ [b.value] P .++ values b.right
103+
104+ union :: forall k v . (P.Ord k ) => Map k v -> Map k v -> Map k v
87105union m1 m2 = foldl (\m (Tuple k v) -> insert k v m) m2 (toList m1)
88106
89107unions :: forall k v . (P.Ord k ) => [Map k v ] -> Map k v
90108unions = foldl union empty
91109
92- map :: forall k v1 v2 . (P.Eq k , P. Ord k ) => (v1 -> v2 ) -> Map k v1 -> Map k v2
110+ map :: forall k v1 v2 . (P.Ord k ) => (v1 -> v2 ) -> Map k v1 -> Map k v2
93111map _ Leaf = Leaf
94112map f (Branch b) = Branch (b { value = f b.value, left = map f b.left, right = map f b.right })
0 commit comments