@@ -19,8 +19,7 @@ module Data.Map
1919 , fromFoldable
2020 , fromFoldableWith
2121 , toList
22- , fromList
23- , fromListWith
22+ , toUnfoldable
2423 , delete
2524 , pop
2625 , member
@@ -38,11 +37,12 @@ module Data.Map
3837import Prelude
3938
4039import Data.Foldable (foldl , foldMap , foldr , class Foldable )
41- import Data.List (List (..), length , nub )
40+ import Data.List (List (..), (:), length , nub )
4241import Data.Maybe (Maybe (..), maybe , isJust , fromMaybe )
4342import Data.Monoid (class Monoid )
4443import Data.Traversable (traverse , class Traversable )
4544import Data.Tuple (Tuple (..), uncurry , snd )
45+ import Data.Unfoldable (class Unfoldable , unfoldr )
4646
4747import Partial.Unsafe (unsafePartial )
4848
@@ -55,16 +55,16 @@ data Map k v
5555instance eqMap :: (Eq k , Eq v ) => Eq (Map k v ) where
5656 eq m1 m2 = toList m1 == toList m2
5757
58- instance showMap :: (Show k , Show v ) => Show (Map k v ) where
59- show m = " (fromList " <> show (toList m) <> " )"
60-
6158instance ordMap :: (Ord k , Ord v ) => Ord (Map k v ) where
6259 compare m1 m2 = compare (toList m1) (toList m2)
6360
64- instance semigroupMap :: (Ord k ) => Semigroup (Map k v ) where
61+ instance showMap :: (Show k , Show v ) => Show (Map k v ) where
62+ show m = " (fromList " <> show (toList m) <> " )"
63+
64+ instance semigroupMap :: Ord k => Semigroup (Map k v ) where
6565 append = union
6666
67- instance monoidMap :: ( Ord k ) => Monoid (Map k v ) where
67+ instance monoidMap :: Ord k => Monoid (Map k v ) where
6868 mempty = empty
6969
7070instance functorMap :: Functor (Map k ) where
@@ -77,7 +77,7 @@ instance foldableMap :: Foldable (Map k) where
7777 foldr f z m = foldr f z (values m)
7878 foldMap f m = foldMap f (values m)
7979
80- instance traversableMap :: ( Ord k ) => Traversable (Map k ) where
80+ instance traversableMap :: Ord k => Traversable (Map k ) where
8181 traverse f ms = foldr (\x acc -> union <$> x <*> acc) (pure empty) ((map (uncurry singleton)) <$> (traverse f <$> toList ms))
8282 sequence = traverse id
8383
@@ -368,17 +368,17 @@ fromFoldableWith f = foldl (\m (Tuple k v) -> alter (combine v) k m) empty where
368368-- | Convert a map to a list of key/value pairs
369369toList :: forall k v . Map k v -> List (Tuple k v )
370370toList Leaf = Nil
371- toList (Two left k v right) = toList left <> pure (Tuple k v) <> toList right
372- toList (Three left k1 v1 mid k2 v2 right) = toList left <> pure (Tuple k1 v1) <> toList mid <> pure (Tuple k2 v2) <> toList right
373-
374- -- | Create a map from a list of key/value pairs
375- fromList :: forall k v . Ord k => List (Tuple k v ) -> Map k v
376- fromList = fromFoldable
371+ toList (Two left k v right) = toList left <> Tuple k v : toList right
372+ toList (Three left k1 v1 mid k2 v2 right) = toList left <> Tuple k1 v1 : toList mid <> Tuple k2 v2 : toList right
377373
378- -- | Create a map from a list of key/value pairs, using the specified function
379- -- | to combine values for duplicate keys.
380- fromListWith :: forall k v . Ord k => (v -> v -> v ) -> List (Tuple k v ) -> Map k v
381- fromListWith = fromFoldableWith
374+ -- | Convert a map to an unfoldable structure of key/value pairs
375+ toUnfoldable :: forall f k v . (Ord k , Unfoldable f ) => Map k v -> f (Tuple k v )
376+ toUnfoldable = unfoldr go
377+ where
378+ go :: Map k v -> Maybe (Tuple (Tuple k v ) (Map k v ))
379+ go Leaf = Nothing
380+ go (Two left k v right) = Just $ Tuple (Tuple k v) (left <> right)
381+ go (Three left k1 v1 mid k2 v2 right) = Just $ Tuple (Tuple k1 v1) (Two left k2 v2 right)
382382
383383-- | Get a list of the keys contained in a map
384384keys :: forall k v . Map k v -> List k
0 commit comments