packages feed

data-combinator-gen-0.1.0.0: examples/Main.hs

{-# LANGUAGE KindSignatures, TypeFamilies, DeriveFunctor, DeriveTraversable,
    DeriveFoldable #-}

module Main where

import Data.Combinators.TH
import Cp -- Program Calculus Combinators library
import Data.Functor.Foldable -- Recursion schemes library
import Data.Functor.Foldable.TH -- Recursion schemes makeBaseFunctor
import Data.List (foldl')

makeCombinator ''ListF

l :: [a] -> Integer
l = cata (listf zero (succ . p2))

data BTree a = Empty | Node(a, (BTree a, BTree a)) deriving Show

makeBaseFunctor ''BTree
makeCombinator ''BTree
makeCombinator ''BTreeF

countBTree :: BTree a -> Integer
countBTree = cata (btreef (const 0) (succ . uncurry (+) . p2))

data Expr a
    = Lit a
    | Add (Expr a) (Expr a)
    | Expr a :* [Expr a]
    deriving (Show)

makeBaseFunctor ''Expr
makeCombinator ''Expr
makeCombinator ''ExprF

eval :: Expr Integer -> Integer
eval = cata (exprf id add (uncurry $ foldl' (*)))

expr1 :: Expr Integer
expr1 = Add (Lit 2) (Mul (Lit 3) [Lit 4])

data A a = C { v :: a, w :: a } | D { x :: a, z :: a }

makeCombinator ''A

data ExprInfix a
    = ExprInfix a :** [ExprInfix a]
    | AddI (ExprInfix a) (ExprInfix a)
    | LitI a
  deriving (Show)

makeCombinator ''ExprInfix

{- GADTs are not currently supported!
data B = forall a. Eq a => B [a]

makeCombinator ''B
-}

main :: IO ()
main = undefined