@@ -2,24 +2,34 @@ module Test.Main where
22
33import Prelude
44
5- import Effect (Effect )
6- import Effect.Console (log )
75import Data.Bifoldable (class Bifoldable , bifoldl , bifoldr , bifoldMap , bifoldrDefault , bifoldlDefault , bifoldMapDefaultR , bifoldMapDefaultL )
86import Data.Bifunctor (class Bifunctor , bimap )
97import Data.Bitraversable (class Bitraversable , bisequenceDefault , bitraverse , bisequence , bitraverseDefault )
108import Data.Foldable (class Foldable , find , findMap , fold , indexl , indexr , foldMap , foldMapDefaultL , foldMapDefaultR , foldl , foldlDefault , foldr , foldrDefault , length , maximum , maximumBy , minimum , minimumBy , null , surroundMap )
119import Data.FoldableWithIndex (class FoldableWithIndex , findWithIndex , foldMapWithIndex , foldMapWithIndexDefaultL , foldMapWithIndexDefaultR , foldlWithIndex , foldlWithIndexDefault , foldrWithIndex , foldrWithIndexDefault , surroundMapWithIndex )
1210import Data.Function (on )
1311import Data.FunctorWithIndex (class FunctorWithIndex , mapWithIndex )
14- import Data.Int (toNumber )
12+ import Data.Int (toNumber , pow )
1513import Data.Maybe (Maybe (..))
1614import Data.Monoid.Additive (Additive (..))
15+ import Data.Newtype (unwrap )
1716import Data.Traversable (class Traversable , sequenceDefault , traverse , sequence , traverseDefault )
1817import Data.TraversableWithIndex (class TraversableWithIndex , traverseWithIndex )
18+ import Effect (Effect , foreachE )
19+ import Effect.Console (log )
1920import Math (abs )
20- import Test.Assert (assert )
21+ import Test.Assert (assert , assert' )
22+ import Unsafe.Coerce (unsafeCoerce )
2123
2224foreign import arrayFrom1UpTo :: Int -> Array Int
25+ foreign import arrayReplicate :: forall a . Int -> a -> Array a
26+
27+ foldableLength :: forall f a . Foldable f => f a -> Int
28+ foldableLength = unwrap <<< foldMap (const (Additive 1 ))
29+
30+ -- Ensure that a value is evaluated 'lazily' by treating it as an Eff action.
31+ deferEff :: forall a . (Unit -> a ) -> Effect a
32+ deferEff = unsafeCoerce
2333
2434main :: Effect Unit
2535main = do
@@ -43,8 +53,9 @@ main = do
4353 log " Test foldrDefault"
4454 testFoldableFoldrDefault 20
4555
46- log " Test traversableArray instance"
47- testTraversableArrayWith 20
56+ foreachE [1 ,2 ,3 ,4 ,5 ,10 ,20 ] \i -> do
57+ log $ " Test traversableArray instance with an array of size: " <> show i
58+ testTraversableArrayWith i
4859
4960 log " Test traversableArray instance is stack safe"
5061 testTraversableArrayWith 20000
@@ -234,19 +245,33 @@ testFoldableWithIndexLawsOn c f g = do
234245 assert $ foldMapWithIndex f c == foldrWithIndexDefault (\i x y -> f i x <> y) mempty c
235246
236247testTraversableFWith
237- :: forall f
248+ :: forall f
238249 . Traversable f
239250 => Eq (f Int )
240251 => (Int -> f Int )
241252 -> Int
242253 -> Effect Unit
243254testTraversableFWith f n = do
244255 let dat = f n
256+ let len = foldableLength dat
257+
258+ _ <- traverse pure dat
259+
260+ assert' " traverse Just == Just" $ traverse Just dat == Just dat
261+ assert' " traverse pure == pure (Array)" $ traverse pure dat == [dat]
262+
263+ when (len <= 10 ) do
264+ result <- deferEff \_ -> traverse (\x -> [x,x]) dat == arrayReplicate (pow 2 len) dat
265+ assert' " traverse with Array as underlying applicative" result
266+
267+ assert' " traverse (const Nothing) == const Nothing" $
268+ traverse (const Nothing :: Int -> Maybe Int ) dat == Nothing
269+
270+ assert' " sequence <<< map f == traverse f" $
271+ sequence (map Just dat) == traverse Just dat
245272
246- assert $ traverse Just dat == Just dat
247- assert $ traverse pure dat == [dat]
248- assert $ traverse (\x -> if x < 10 then Just x else Nothing ) dat == Nothing
249- assert $ sequence (map Just dat) == traverse Just dat
273+ assert' " underlying applicative" $
274+ (traverse pure dat :: Unit -> f Int ) unit == dat
250275
251276testTraversableArrayWith :: Int -> Effect Unit
252277testTraversableArrayWith = testTraversableFWith arrayFrom1UpTo
0 commit comments