yaya-hedgehog-0.1.0.0: src/Yaya/Hedgehog/Expr.hs
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TemplateHaskell #-}
module Yaya.Hedgehog.Expr where
import Data.Eq.Deriving
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Text.Show.Deriving
import Yaya.Fold
import Yaya.Fold.Native
import Yaya.Hedgehog.Fold
data Expr a
= Lit Int
| Add a a
| Mult a a
deriving (Eq, Show, Functor, Foldable, Traversable)
deriveEq1 ''Expr
deriveShow1 ''Expr
genExprLit :: Gen (Expr a)
genExprLit = Lit <$> Gen.int (Range.linear (-1000) 1000)
genExprOp :: Gen a -> Gen (Expr a)
genExprOp a = Gen.choice [Add <$> a <*> a, Mult <$> a <*> a]
genExpr :: Gen a -> Gen (Expr a)
genExpr a = Gen.frequency [(3, genExprLit), (2, genExprOp a)]
expression :: Steppable t Expr => Size -> Gen t
expression = embeddableOfHeight genExprLit genExpr
genMuExpr :: Size -> Gen (Mu Expr)
genMuExpr = expression
genNuExpr :: Size -> Gen (Nu Expr)
genNuExpr = expression
genFixExpr :: Size -> Gen (Fix Expr)
genFixExpr = expression