@@ -15,7 +15,8 @@ import Data.List.NonEmpty as NEL
15
15
import Data.Maybe (Maybe (..))
16
16
import Data.NonEmpty ((:|))
17
17
import Data.StrMap as M
18
- import Data.Tuple (Tuple (..), fst )
18
+ import Data.Tuple (Tuple (..), fst , uncurry )
19
+ import Data.Traversable (traverse , sequence )
19
20
20
21
import Partial.Unsafe (unsafePartial )
21
22
@@ -28,6 +29,11 @@ newtype TestStrMap v = TestStrMap (M.StrMap v)
28
29
instance arbTestStrMap :: (Arbitrary v ) => Arbitrary (TestStrMap v ) where
29
30
arbitrary = TestStrMap <<< (M .fromFoldable :: L.List (Tuple String v ) -> M.StrMap v ) <$> arbitrary
30
31
32
+ newtype SmallArray v = SmallArray (Array v )
33
+
34
+ instance arbSmallArray :: (Arbitrary v ) => Arbitrary (SmallArray v ) where
35
+ arbitrary = SmallArray <$> Gen .resize 3 arbitrary
36
+
31
37
data Instruction k v = Insert k v | Delete k
32
38
33
39
instance showInstruction :: (Show k , Show v ) => Show (Instruction k v ) where
@@ -54,6 +60,14 @@ runInstructions instrs t0 = foldl step t0 instrs
54
60
number :: Int -> Int
55
61
number n = n
56
62
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
+
68
+ toAscArray :: forall a . M.StrMap a -> Array (Tuple String a )
69
+ toAscArray = M .toAscUnfoldable
70
+
57
71
strMapTests :: forall eff . Eff (console :: CONSOLE , random :: RANDOM , exception :: EXCEPTION | eff ) Unit
58
72
strMapTests = do
59
73
log " Test inserting into empty tree"
@@ -167,6 +181,11 @@ strMapTests = do
167
181
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 )
168
182
in resultViaMapWithKey === resultViaLists
169
183
184
+ log " sequence gives the same results as an old version (up to ordering)"
185
+ 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)
188
+
170
189
log " Bug #63: accidental observable mutation in foldMap"
171
190
quickCheck \(TestStrMap m) ->
172
191
let lhs = go m
0 commit comments