express-1.0.18: test/name-derive.hs
-- Copyright (c) 2019-2024 Rudy Matela.
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
{-# LANGUAGE TemplateHaskell #-}
import Test
import Data.Express.Utils.List
data Peano = Zero | Succ Peano deriving Show
data Lst a = a :- Lst a | Nil deriving Show
data Bush a = Bush a :-: Bush a | Leaf a deriving (Show, Eq)
data Tree a = Node (Tree a) a (Tree a) | Null deriving (Show, Eq)
instance Num Peano where
Zero + n = n
(Succ n) + m = Succ (n + m)
Zero * n = Zero
(Succ n) * m = m + n * m
abs = id
signum Zero = 0
signum (Succ n) = 1
fromInteger n = iterate Succ Zero !! fromInteger n
Zero - m = Zero
n - Zero = Zero
Succ n - Succ m = n - m
deriveName ''Peano
deriveName ''Lst
deriveName ''Bush
deriveName ''Tree
-- Recursive nested datatype cascade
data RN = RN RN0 (RN1 Int) (RN2 Int RN)
data RN0 = Nest0 Int | Recurse0 RN
data RN1 a = Nest1 a | Recurse1 RN
data RN2 a b = Nest2 a b | Recurse2 RN
deriveNameCascading ''RN
-- Those should have no effect (instance already exists):
{- uncommenting those should generate warnings
deriveName ''Bool
deriveName ''Maybe
deriveName ''Either
-}
-- Those should not generate warnings
deriveNameIfNeeded ''Bool
deriveNameIfNeeded ''Maybe
deriveNameIfNeeded ''Either
main :: IO ()
main = mainTest tests 5040
tests :: Int -> [Bool]
tests n =
[ True
, name (undefined :: Peano) == "x"
, name (undefined :: Lst Int) == "l"
, name (undefined :: Bush Int) == "b"
, name (undefined :: Tree Int) == "t"
, name (undefined :: Lst Bool) == "l"
, name (undefined :: Bush Bool) == "b"
, name (undefined :: Tree Bool) == "t"
, name (undefined :: RN) == "r"
, name (undefined :: RN0) == "r"
, name (undefined :: RN1 Int) == "r"
, name (undefined :: RN2 Bool Int) == "r"
]