packages feed

yaya-test-0.3.0.0: test/Test/Retrofit.hs

{-# LANGUAGE TemplateHaskell #-}

-- | The point of this module is that it should compile _without_ importing any
--   other Yaya modules.
module Test.Retrofit where

import           Hedgehog

import qualified Yaya.Hedgehog.Expr as ExprF
import           Yaya.Retrofit

data DExpr
  = Lit Int
  | Add DExpr DExpr
  | Mult DExpr DExpr

instance Projectable (->) DExpr ExprF.Expr where
  project = \case
    Lit i -> ExprF.Lit i
    Add a b -> ExprF.Add a b
    Mult a b -> ExprF.Mult a b

instance Steppable (->) DExpr ExprF.Expr where
  embed = \case
    ExprF.Lit i -> Lit i
    ExprF.Add a b -> Add a b
    ExprF.Mult a b -> Mult a b

instance Corecursive (->) DExpr ExprF.Expr where
  ana ψ = embed . fmap (ana ψ) . ψ

-- | This is unsafe, but we really just want to make sure all the methods are
--   available.
instance Recursive (->) DExpr ExprF.Expr where
  cata φ = φ . fmap (cata φ) . project

-- | This can be derived in this case, but we want to ensure we could define it
--   if necessary.
instance Eq DExpr where
  (==) = recursiveEq

-- | This can be derived in this case, but we want to ensure we could define it
--   if necessary.
instance Show DExpr where
  showsPrec = recursiveShowsPrec

tests :: IO Bool
tests = checkParallel $$(discover)