11module Test.Data.Map where
22
33import Prelude
4-
4+ import Data.List.NonEmpty as NEL
5+ import Data.Map as M
56import Control.Alt ((<|>))
67import Control.Monad.Eff (Eff )
78import Control.Monad.Eff.Console (log , CONSOLE )
89import Control.Monad.Eff.Exception (EXCEPTION )
910import Control.Monad.Eff.Random (RANDOM )
10-
1111import Data.Foldable (foldl , for_ , all )
1212import Data.Function (on )
13- import Data.List (List (..), groupBy , length , nubBy , sortBy , singleton )
14- import Data.List.NonEmpty as NEL
15- import Data.Map as M
13+ import Data.List (List (Cons), groupBy , length , nubBy , singleton , sort , sortBy )
1614import Data.Maybe (Maybe (..), fromMaybe )
1715import Data.Tuple (Tuple (..), fst )
18-
1916import Partial.Unsafe (unsafePartial )
20-
2117import Test.QuickCheck ((<?>), (===), quickCheck , quickCheck' )
2218import Test.QuickCheck.Arbitrary (class Arbitrary , arbitrary )
2319
@@ -170,7 +166,7 @@ mapTests = do
170166 in M .lookup k tree == Just v <?> (" instrs:\n " <> show instrs <> " \n k:\n " <> show k <> " \n v:\n " <> show v)
171167
172168 log " Singleton to list"
173- quickCheck $ \k v -> M .toList (M .singleton k v :: M.Map SmallKey Int ) == singleton (Tuple k v)
169+ quickCheck $ \k v -> M .toUnfoldable (M .singleton k v :: M.Map SmallKey Int ) == singleton (Tuple k v)
174170
175171 log " fromFoldable [] = empty"
176172 quickCheck (M .fromFoldable [] == (M .empty :: M.Map Unit Unit )
@@ -194,21 +190,21 @@ mapTests = do
194190 quickCheck (M .lookup 1 nums == Just 2 <?> " invalid lookup - 1" )
195191 quickCheck (M .lookup 2 nums == Nothing <?> " invalid lookup - 2" )
196192
197- log " toList . fromFoldable = id"
198- quickCheck $ \arr -> let f x = M .toList (M .fromFoldable x)
199- in f (f arr) == f (arr :: List (Tuple SmallKey Int )) <?> show arr
200-
201- log " fromFoldable . toList = id"
202- quickCheck $ \(TestMap m) -> let f m' = M .fromFoldable (M .toList m') in
203- M .toList (f m) == M .toList (m :: M.Map SmallKey Int ) <?> show m
193+ log " sort . toUnfoldable . fromFoldable = sort (on lists without key-duplicates)"
194+ quickCheck $ \(list :: List (Tuple SmallKey Int )) ->
195+ let nubbedList = nubBy ((==) `on` fst) list
196+ f x = M .toUnfoldable (M .fromFoldable x)
197+ in sort (f nubbedList) == sort nubbedList <?> show nubbedList
204198
205199 log " fromFoldable . toUnfoldable = id"
206- quickCheck $ \(TestMap m) -> let f m' = M .fromFoldable (M .toUnfoldable m' :: List (Tuple SmallKey Int )) in
207- f m == (m :: M.Map SmallKey Int ) <?> show m
200+ quickCheck $ \(TestMap (m :: M.Map SmallKey Int )) ->
201+ let f m' = M .fromFoldable (M .toUnfoldable m' :: List (Tuple SmallKey Int ))
202+ in f m == m <?> show m
208203
209204 log " fromFoldableWith const = fromFoldable"
210- quickCheck $ \arr -> M .fromFoldableWith const arr ==
211- M .fromFoldable (arr :: List (Tuple SmallKey Int )) <?> show arr
205+ quickCheck $ \arr ->
206+ M .fromFoldableWith const arr ==
207+ M .fromFoldable (arr :: List (Tuple SmallKey Int )) <?> show arr
212208
213209 log " fromFoldableWith (<>) = fromFoldable . collapse with (<>) . group on fst"
214210 quickCheck $ \arr ->
@@ -218,6 +214,12 @@ mapTests = do
218214 groupBy ((==) `on` fst) <<< sortBy (compare `on` fst) in
219215 M .fromFoldableWith (<>) arr === f (arr :: List (Tuple String String ))
220216
217+ log " toAscUnfoldable is sorted version of toUnfoldable"
218+ quickCheck $ \(TestMap m) ->
219+ let list = M .toUnfoldable (m :: M.Map SmallKey Int )
220+ ascList = M .toAscUnfoldable m
221+ in ascList === sortBy (compare `on` fst) list
222+
221223 log " Lookup from union"
222224 quickCheck $ \(TestMap m1) (TestMap m2) k ->
223225 M .lookup (smallKey k) (M .union m1 m2) == (case M .lookup k m1 of
@@ -310,5 +312,6 @@ mapTests = do
310312 quickCheck $ \(TestMap m :: TestMap String Int ) -> let
311313 f k v = k <> show v
312314 resultViaMapWithKey = m # M .mapWithKey f
313- resultViaLists = m # M .toList # map (\(Tuple k v) → Tuple k (f k v)) # M .fromFoldable
315+ toList = M .toUnfoldable :: forall k v . M.Map k v -> List (Tuple k v )
316+ resultViaLists = m # toList # map (\(Tuple k v) → Tuple k (f k v)) # M .fromFoldable
314317 in resultViaMapWithKey === resultViaLists
0 commit comments