{-# LANGUAGE DeriveFunctor, DeriveTraversable, DeriveFoldable, TemplateHaskell, FlexibleContexts #-} module DataTypes.Comp where import Data.Comp.Derive type Var = String data Arith a = Add a a | Val Int deriving (Show, Functor, Foldable, Traversable) data Let a = Let Var a a | Var Var deriving (Show, Functor, Foldable, Traversable) data Exc a = Throw | Catch a a deriving (Show, Functor, Foldable, Traversable) data Code a = PUSH Int a | ADD a | THROW | MARK a a | UNMARK a | NIL $(derive [makeEqF, makeNFDataF, makeArbitraryF, smartConstructors] [''Arith, ''Let, ''Exc])