Skip to content
This repository was archived by the owner on Oct 4, 2020. It is now read-only.

Commit 91cee50

Browse files
committed
Better test of Traversable StrMap (& new instance of Ord StrMap)
1 parent 2c42ac7 commit 91cee50

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

src/Data/StrMap.purs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,13 @@ instance eqStrMap :: Eq a => Eq (StrMap a) where
133133
instance eq1StrMap :: Eq1 StrMap where
134134
eq1 = eq
135135

136+
-- Internal use
137+
toAscArray :: forall v. StrMap v -> Array (Tuple String v)
138+
toAscArray = toAscUnfoldable
139+
140+
instance ordStrMap :: Ord a => Ord (StrMap a) where
141+
compare m1 m2 = compare (toAscArray m1) (toAscArray m2)
142+
136143
instance showStrMap :: Show a => Show (StrMap a) where
137144
show m = "(fromFoldable " <> show (toArray m) <> ")"
138145

test/Test/Data/StrMap.purs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import Data.List.NonEmpty as NEL
1515
import Data.Maybe (Maybe(..))
1616
import Data.NonEmpty ((:|))
1717
import Data.StrMap as M
18-
import Data.Tuple (Tuple(..), fst, uncurry)
19-
import Data.Traversable (traverse, sequence)
18+
import Data.Tuple (Tuple(..), fst)
19+
import Data.Traversable (sequence)
2020

2121
import Partial.Unsafe (unsafePartial)
2222

@@ -60,11 +60,6 @@ runInstructions instrs t0 = foldl step t0 instrs
6060
number :: Int -> Int
6161
number n = n
6262

63-
oldTraverse :: forall a b m. Applicative m => (a -> m b) -> M.StrMap a -> m (M.StrMap b)
64-
oldTraverse f ms = A.foldr (\x acc -> M.union <$> x <*> acc) (pure M.empty) ((map (uncurry M.singleton)) <$> (traverse f <$> (M.toUnfoldable ms :: Array (Tuple String a))))
65-
oldSequence :: forall a m. Applicative m => M.StrMap (m a) -> m (M.StrMap a)
66-
oldSequence = oldTraverse id
67-
6863
toAscArray :: forall a. M.StrMap a -> Array (Tuple String a)
6964
toAscArray = M.toAscUnfoldable
7065

@@ -181,10 +176,18 @@ strMapTests = do
181176
resultViaLists = m # M.toUnfoldable # map (\(Tuple k v) → Tuple k (f k v)) # (M.fromFoldable :: forall a. L.List (Tuple String a) -> M.StrMap a)
182177
in resultViaMapWithKey === resultViaLists
183178

184-
log "sequence gives the same results as an old version (up to ordering)"
179+
log "sequence works (for m = Array)"
185180
quickCheck \(TestStrMap mOfSmallArrays :: TestStrMap (SmallArray Int)) ->
186-
let m = (\(SmallArray a) -> a) <$> mOfSmallArrays
187-
in A.sort (toAscArray <$> oldSequence m) === A.sort (toAscArray <$> sequence m)
181+
let m = (\(SmallArray a) -> a) <$> mOfSmallArrays
182+
Tuple keys values = A.unzip (toAscArray m)
183+
resultViaArrays = (M.fromFoldable <<< A.zip keys) <$> sequence values
184+
in A.sort (sequence m) === A.sort (resultViaArrays)
185+
186+
log "sequence works (for m = Maybe)"
187+
quickCheck \(TestStrMap m :: TestStrMap (Maybe Int)) ->
188+
let Tuple keys values = A.unzip (toAscArray m)
189+
resultViaArrays = (M.fromFoldable <<< A.zip keys) <$> sequence values
190+
in sequence m === resultViaArrays
188191

189192
log "Bug #63: accidental observable mutation in foldMap"
190193
quickCheck \(TestStrMap m) ->

0 commit comments

Comments
 (0)