classyplate-0.3.0.1: examples/Generate.hs
module Generate where
import Example
generateA :: Int -> A
generateA d = ABC (generateB (d - 1)) (generateC (d - 1))
generateB :: Int -> B
generateB d
| d <= 0 = B
| otherwise = BA (generateA (d - 1))
generateC :: Int -> C
generateC d
| d `mod` 2 == 0 = CB (generateB (d - 1))
| otherwise = CD (generateD (d - 1))
generateD :: Int -> D
generateD d
| d <= 0 = D
| otherwise = DDE (generateD (d - 1)) E
sizeA (ABC b c) = 1 + sizeB b + sizeC c
sizeB B = 1
sizeB (BA a) = 1 + sizeA a
sizeC (CB b) = 1 + sizeB b
sizeC (CD d) = 1 + sizeD d
sizeD D = 1
sizeD (DDE d e) = 1 + sizeD d + 1
---
testFun1 :: D -> D
{-# NOINLINE testFun1 #-}
testFun1 d = d
testFun2 :: C -> C
{-# NOINLINE testFun2 #-}
testFun2 c = c