packages feed

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

module Main where

import Prelude
import Data.Eq (class Eq1)
import Effect.Console (log)
import Data.List (List(..), (:))
import Data.Tuple (Tuple(..))
import Test.Assert

type RecordFields f a =
  { a :: a
  , zArrayA :: Array a
  , fa :: f a
  , ignore :: Int
  , recursiveA :: Array (Tuple Int (Array a))
  , arrayIgnore :: Array Int
  , fIgnore :: f Int
  , empty :: {}
  }

data M f a
  = M0 a (Array a)
  | M1 Int
  | M2 (f a)
  | M3 (RecordFields f a)
  | M4 { nested :: RecordFields f a }
  | M5 Int a (Array Int) (Array a) (f a) (f Int) (RecordFields f a) { nested :: RecordFields f a }
  | M6 (Array (Array (Array a)))

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

type MA = M Array

m0L = M0 0 [1, 2] :: MA Int
m0R = M0 "0" ["1", "2"] :: MA String

m1L = M1 0 :: MA Int
m1R = M1 0 :: MA String

m2L = M2 [0, 1] :: MA Int
m2R = M2 ["0", "1"] :: MA String

m3L = M3 recordValueL :: MA Int
m3R = M3 recordValueR :: MA String

m4L = M4 { nested: recordValueL } :: MA Int
m4R = M4 { nested: recordValueR } :: MA String

m5L = M5 0 1 [2, 3] [3, 4] [5, 6] [7, 8] recordValueL { nested: recordValueL } :: MA Int
m5R = M5 0 "1" [2, 3] ["3", "4"] ["5", "6"] [7, 8] recordValueR { nested: recordValueR } :: MA String

recordValueL :: RecordFields Array Int
recordValueL = { a: 71, zArrayA: [72], fa: [73], ignore: 91, recursiveA: [ Tuple 1 [1], Tuple 2 [2] ], arrayIgnore: [92, 93], fIgnore: [94], empty: {} }

recordValueR :: RecordFields Array String
recordValueR = { a: "71", zArrayA: ["72"], fa: ["73"], ignore: 91, recursiveA: [ Tuple 1 ["1"], Tuple 2 ["2"] ], arrayIgnore: [92, 93], fIgnore: [94], empty: {} }

m6L = M6 [[[1, 2]]] :: MA Int
m6R = M6 [[["1", "2"]]] :: MA String

maTests = do
  assert' "map - M0" $ map show m0L == m0R
  assert' "map - M1" $ map show m1L == m1R
  assert' "map - M2" $ map show m2L == m2R
  assert' "map - M3" $ map show m3L == m3R
  assert' "map - M4" $ map show m4L == m4R
  assert' "map - M5" $ map show m5L == m5R
  assert' "map - M6" $ map show m6L == m6R

data Fun1 a = Fun1 (Int -> Int -> a)
derive instance Functor Fun1

f1Test = do
  assert' "map - Fun1" do
    let
      fn = show
      left a b = a + b
      right a b = fn $ left a b
      Fun1 left' = map fn $ Fun1 left
    left' 1 2 == right 1 2

data Fun2 a = Fun2 (Int -> Int -> Array (Array a))
derive instance Functor Fun2

f2Test = do
  assert' "map - Fun2" do
    let
      fn = show
      left a b = [[a + b]]
      right a b = map (map fn) $ left a b
      Fun2 left' = map fn $ Fun2 left
    left' 1 2 == right 1 2

data Fun3 f a = Fun3 (Unit -> Array (f (Array { nested :: RecordFields f a })))
derive instance Functor f => Functor (Fun3 f)

f3Test = do
  assert' "map - Fun3" do
    let
      left _ = [[[{ nested: recordValueL }]]]
      right _ = [[[{ nested: recordValueR }]]]
      Fun3 left' = map show $ Fun3 left
    left' unit == right unit

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

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

funTests = do
  f1Test
  f2Test
  f3Test
  taTests

main = do
  maTests
  funTests

  log "Done"