packages feed

purescript-0.12.0: tests/purs/passing/DerivingFunctor.purs

module Main where

import Prelude
import Data.Eq (class Eq1)
import Effect.Console (log)
import Test.Assert

type MyRecord a = { myField :: a }

data M f a
  = M0 a (Array a)
  | M1 Int
  | M2 (f a)
  | M3 { foo :: Int, bar :: a, baz :: f a }
  | M4 (MyRecord a)

derive instance eqM :: (Eq1 f, Eq a) => Eq (M f a)
derive instance functorM :: Functor f => Functor (M f)

data T a = T (forall t. Show t => t -> a)
derive instance functorT :: Functor T

type MA = M Array

main = do
  assert $ map show (M0 0 [1, 2] :: MA Int) == M0 "0" ["1", "2"]
  assert $ map show (M1 0 :: MA Int) == M1 0
  assert $ map show (M2 [0, 1] :: MA Int) == M2 ["0", "1"]
  assert $ map show (M3 {foo: 0, bar: 1, baz: [2, 3]} :: MA Int) == M3 {foo: 0, bar: "1", baz: ["2", "3"]}
  assert $ map show (M4 { myField: 42 }) == M4 { myField: "42" } :: MA String

  case map show (T \_ -> 42) of
    T f -> assert $ f "hello" == "42"
    _   -> assert false

  log "Done"