1
1
module Test.Data.Map where
2
2
3
3
import Prelude
4
-
4
+ import Data.List.NonEmpty as NEL
5
+ import Data.Map as M
5
6
import Control.Alt ((<|>))
6
7
import Control.Monad.Eff (Eff )
7
8
import Control.Monad.Eff.Console (log , CONSOLE )
8
9
import Control.Monad.Eff.Exception (EXCEPTION )
9
10
import Control.Monad.Eff.Random (RANDOM )
10
-
11
11
import Data.Foldable (foldl , for_ , all )
12
12
import 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 )
16
14
import Data.Maybe (Maybe (..), fromMaybe )
17
15
import Data.Tuple (Tuple (..), fst )
18
-
19
16
import Partial.Unsafe (unsafePartial )
20
-
21
17
import Test.QuickCheck ((<?>), (===), quickCheck , quickCheck' )
22
18
import Test.QuickCheck.Arbitrary (class Arbitrary , arbitrary )
23
19
@@ -170,7 +166,7 @@ mapTests = do
170
166
in M .lookup k tree == Just v <?> (" instrs:\n " <> show instrs <> " \n k:\n " <> show k <> " \n v:\n " <> show v)
171
167
172
168
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)
174
170
175
171
log " fromFoldable [] = empty"
176
172
quickCheck (M .fromFoldable [] == (M .empty :: M.Map Unit Unit )
@@ -194,21 +190,21 @@ mapTests = do
194
190
quickCheck (M .lookup 1 nums == Just 2 <?> " invalid lookup - 1" )
195
191
quickCheck (M .lookup 2 nums == Nothing <?> " invalid lookup - 2" )
196
192
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
204
198
205
199
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
208
203
209
204
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
212
208
213
209
log " fromFoldableWith (<>) = fromFoldable . collapse with (<>) . group on fst"
214
210
quickCheck $ \arr ->
@@ -218,6 +214,12 @@ mapTests = do
218
214
groupBy ((==) `on` fst) <<< sortBy (compare `on` fst) in
219
215
M .fromFoldableWith (<>) arr === f (arr :: List (Tuple String String ))
220
216
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
+
221
223
log " Lookup from union"
222
224
quickCheck $ \(TestMap m1) (TestMap m2) k ->
223
225
M .lookup (smallKey k) (M .union m1 m2) == (case M .lookup k m1 of
@@ -310,5 +312,6 @@ mapTests = do
310
312
quickCheck $ \(TestMap m :: TestMap String Int ) -> let
311
313
f k v = k <> show v
312
314
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
314
317
in resultViaMapWithKey === resultViaLists
0 commit comments