1-
21module Test.Main where
32
43import Prelude
54
5+ import Control.Monad.Eff (Eff ())
66import Control.Monad.Eff.Console
77import Data.Foldable
88import Data.Maybe
@@ -14,30 +14,133 @@ foreign import arrayFrom1UpTo :: Int -> Array Int
1414
1515main = do
1616 log " Test foldableArray instance"
17- testFoldableWith 20
17+ testFoldableArrayWith 20
1818
1919 log " Test traversableArray instance"
20- testTraversableWith 20
20+ testTraversableArrayWith 20
2121
2222 log " Test foldableArray instance is stack safe"
23- testFoldableWith 20000
23+ testFoldableArrayWith 20000
2424
2525 log " Test traversableArray instance is stack safe"
26- testTraversableWith 20000
26+ testTraversableArrayWith 20000
27+
28+ log " Test foldMapDefaultL"
29+ testFoldableFoldMapDefaultL 20
30+
31+ log " Test foldMapDefaultR"
32+ testFoldableFoldMapDefaultR 20
33+
34+ log " Test foldlDefault"
35+ testFoldableFoldlDefault 20
36+
37+ log " Test foldrDefault"
38+ testFoldableFoldlDefault 20
39+
40+ log " Test traverseDefault"
41+ testTraverseDefault 20
42+
43+ log " Test sequenceDefault"
44+ testSequenceDefault 20
2745
2846 log " All done!"
2947
30- testFoldableWith n = do
31- let arr = arrayFrom1UpTo n
48+
49+ testFoldableFWith :: forall f e . (Foldable f , Eq (f Int )) => (Int -> f Int ) -> Int -> Eff (assert :: ASSERT | e ) Unit
50+ testFoldableFWith f n = do
51+ let arr = f n
3252 let expectedSum = (n / 2 ) * (n + 1 )
3353
3454 assert $ foldr (+) 0 arr == expectedSum
3555 assert $ foldl (+) 0 arr == expectedSum
3656 assert $ foldMap Additive arr == Additive expectedSum
3757
38- testTraversableWith n = do
39- let arr = arrayFrom1UpTo n
58+ testFoldableArrayWith = testFoldableFWith arrayFrom1UpTo
59+
60+
61+ testTraversableFWith :: forall f e . (Traversable f , Eq (f Int )) => (Int -> f Int ) -> Int -> Eff (assert :: ASSERT | e ) Unit
62+ testTraversableFWith f n = do
63+ let arr = f n
4064
4165 assert $ traverse Just arr == Just arr
4266 assert $ traverse return arr == [arr]
4367 assert $ traverse (\x -> if x < 10 then Just x else Nothing ) arr == Nothing
68+ assert $ sequence (map Just arr) == traverse Just arr
69+
70+ testTraversableArrayWith = testTraversableFWith arrayFrom1UpTo
71+
72+
73+ -- structures for testing default `Foldable` implementations
74+
75+ newtype FoldMapDefaultL a = FML (Array a )
76+ newtype FoldMapDefaultR a = FMR (Array a )
77+ newtype FoldlDefault a = FLD (Array a )
78+ newtype FoldrDefault a = FRD (Array a )
79+
80+ instance eqFML :: (Eq a ) => Eq (FoldMapDefaultL a ) where eq (FML l) (FML r) = l == r
81+ instance eqFMR :: (Eq a ) => Eq (FoldMapDefaultR a ) where eq (FMR l) (FMR r) = l == r
82+ instance eqFLD :: (Eq a ) => Eq (FoldlDefault a ) where eq (FLD l) (FLD r) = l == r
83+ instance eqFRD :: (Eq a ) => Eq (FoldrDefault a ) where eq (FRD l) (FRD r) = l == r
84+
85+ -- implemented `foldl` and `foldr`, but default `foldMap` using `foldl`
86+ instance foldableFML :: Foldable FoldMapDefaultL where
87+ foldMap f = foldMapDefaultL f
88+ foldl f u (FML a) = foldl f u a
89+ foldr f u (FML a) = foldr f u a
90+
91+ -- implemented `foldl` and `foldr`, but default `foldMap`, using `foldr`
92+ instance foldableFMR :: Foldable FoldMapDefaultR where
93+ foldMap f = foldMapDefaultR f
94+ foldl f u (FMR a) = foldl f u a
95+ foldr f u (FMR a) = foldr f u a
96+
97+ -- implemented `foldMap` and `foldr`, but default `foldMap`
98+ instance foldableDFL :: Foldable FoldlDefault where
99+ foldMap f (FLD a) = foldMap f a
100+ foldl f u = foldlDefault f u
101+ foldr f u (FLD a) = foldr f u a
102+
103+ -- implemented `foldMap` and `foldl`, but default `foldr`
104+ instance foldableDFR :: Foldable FoldrDefault where
105+ foldMap f (FRD a) = foldMap f a
106+ foldl f u (FRD a) = foldl f u a
107+ foldr f u = foldrDefault f u
108+
109+ testFoldableFoldMapDefaultL = testFoldableFWith (FML <<< arrayFrom1UpTo)
110+ testFoldableFoldMapDefaultR = testFoldableFWith (FMR <<< arrayFrom1UpTo)
111+ testFoldableFoldlDefault = testFoldableFWith (FLD <<< arrayFrom1UpTo)
112+ testFoldableFoldrDefault = testFoldableFWith (FRD <<< arrayFrom1UpTo)
113+
114+
115+ -- structures for testing default `Traversable` implementations
116+
117+ newtype TraverseDefault a = TD (Array a )
118+ newtype SequenceDefault a = SD (Array a )
119+
120+ instance eqTD :: (Eq a ) => Eq (TraverseDefault a ) where eq (TD l) (TD r) = l == r
121+ instance eqSD :: (Eq a ) => Eq (SequenceDefault a ) where eq (SD l) (SD r) = l == r
122+
123+ instance functorTD :: Functor TraverseDefault where map f (TD a) = TD (map f a)
124+ instance functorSD :: Functor SequenceDefault where map f (SD a) = SD (map f a)
125+
126+ instance foldableTD :: Foldable TraverseDefault where
127+ foldMap f (TD a) = foldMap f a
128+ foldr f u (TD a) = foldr f u a
129+ foldl f u (TD a) = foldl f u a
130+
131+ instance foldableSD :: Foldable SequenceDefault where
132+ foldMap f (SD a) = foldMap f a
133+ foldr f u (SD a) = foldr f u a
134+ foldl f u (SD a) = foldl f u a
135+
136+ instance traversableTD :: Traversable TraverseDefault where
137+ traverse f = traverseDefault f
138+ sequence (TD a) = map TD (sequence a)
139+
140+ instance traversableSD :: Traversable SequenceDefault where
141+ traverse f (SD a) = map SD (traverse f a)
142+ sequence m = sequenceDefault m
143+
144+ testTraverseDefault = testTraversableFWith (TD <<< arrayFrom1UpTo)
145+ testSequenceDefault = testTraversableFWith (SD <<< arrayFrom1UpTo)
146+
0 commit comments