purescript-0.15.5: tests/purs/passing/DerivingFoldable.purs
module Main where
import Prelude
import Effect.Console (log)
import Data.Foldable (class Foldable, foldl, foldr, foldMap)
import Test.Assert
-- Fold is done in alphabetical ordering of labels,
-- not their order in definition
type RecordFields f a =
{ a :: a
, zArrayA :: Array a
, fa :: f a
, ignore :: Int
, arrayIgnore :: Array Int
, fIgnore :: f Int
}
data M f a
= M0
| M1 a (Array a)
| M2 Int (forall a. Array a -> Array a)
| M3 (f a)
| M4 (RecordFields f a)
| M5 { nested :: RecordFields f a }
| M6 Int a (Array Int) (Array a) (f a) (f Int) (RecordFields f a) { nested :: RecordFields f a }
| M7 (f (f { nested :: RecordFields f a }))
derive instance foldableM :: Foldable f => Foldable (M f)
type MArrStr = M Array String
foldlStr :: forall f. Foldable f => f String -> String
foldlStr = foldl (\acc next -> acc <> "<" <> next) "Start"
foldrStr :: forall f. Foldable f => f String -> String
foldrStr = foldr (\next acc -> next <> ">" <> acc) "Start"
foldMapStr :: forall f. Foldable f => f String -> String
foldMapStr = foldMap identity
m0 = M0 :: MArrStr
m1 = M1 "a" ["b", "c"] :: MArrStr
m2 = M2 0 identity :: MArrStr
m3 = M3 ["a", "b", "c"] :: MArrStr
m4 = M4 recordValue :: MArrStr
m5 = M5 { nested: recordValue } :: MArrStr
m6 = M6 1 "a" [] ["b"] ["c"] [] recordValue { nested: recordValue } :: MArrStr
m7 = M7 [[{ nested: recordValue }]] :: MArrStr
recordValue :: RecordFields Array String
recordValue =
{ a: "a"
, zArrayA: ["c"]
, fa: ["b"]
, ignore: 1
, arrayIgnore: [2, 3]
, fIgnore: [4]
}
main = do
assertEqual' "foldl - M0" { expected: "Start", actual: foldlStr m0 }
assertEqual' "foldl - M1" { expected: "Start<a<b<c", actual: foldlStr m1 }
assertEqual' "foldl - M2" { expected: "Start", actual: foldlStr m2 }
assertEqual' "foldl - M3" { expected: "Start<a<b<c", actual: foldlStr m3 }
assertEqual' "foldl - M4" { expected: "Start<a<b<c", actual: foldlStr m4 }
assertEqual' "foldl - M5" { expected: "Start<a<b<c", actual: foldlStr m5 }
assertEqual' "foldl - M6" { expected: "Start<a<b<c<a<b<c<a<b<c", actual: foldlStr m6 }
assertEqual' "foldl - M7" { expected: "Start<a<b<c", actual: foldlStr m7 }
assertEqual' "foldr - M0" { expected: "Start", actual: foldrStr m0 }
assertEqual' "foldr - M1" { expected: "a>b>c>Start", actual: foldrStr m1 }
assertEqual' "foldr - M2" { expected: "Start", actual: foldrStr m2 }
assertEqual' "foldr - M3" { expected: "a>b>c>Start", actual: foldrStr m3 }
assertEqual' "foldr - M4" { expected: "a>b>c>Start", actual: foldrStr m4 }
assertEqual' "foldr - M5" { expected: "a>b>c>Start", actual: foldrStr m5 }
assertEqual' "foldr - M6" { expected: "a>b>c>a>b>c>a>b>c>Start", actual: foldrStr m6 }
assertEqual' "foldr - M7" { expected: "a>b>c>Start", actual: foldrStr m7 }
assertEqual' "foldMap - M0" { expected: "", actual: foldMapStr m0 }
assertEqual' "foldMap - M1" { expected: "abc", actual: foldMapStr m1 }
assertEqual' "foldMap - M2" { expected: "", actual: foldMapStr m2 }
assertEqual' "foldMap - M3" { expected: "abc", actual: foldMapStr m3 }
assertEqual' "foldMap - M4" { expected: "abc", actual: foldMapStr m4 }
assertEqual' "foldMap - M5" { expected: "abc", actual: foldMapStr m5 }
assertEqual' "foldMap - M6" { expected: "abcabcabc", actual: foldMapStr m6 }
assertEqual' "foldMap - M7" { expected: "abc", actual: foldMapStr m7 }
log "Done"