import Data.Foldable.Functor.Examples (Bert (Add, Bert, Num),
Ernie (Ernie, Multiply),
collapseBertSyntaxTree,
collapseErnieSyntaxTree,
collapseErnieSyntaxTree')
import Test.Hspec (describe, hspec, it, parallel,
shouldBe)
bertSum :: Bert
bertSum = Add (Num 2) (Num 3)
ernieMult :: Ernie
ernieMult = Multiply (Ernie bertSum) (Ernie (Num 3))
bertNothing :: Bert
bertNothing = Bert ernieMult
ernieComplex :: Ernie
ernieComplex = Ernie bertNothing
bertComplex :: Bert
bertComplex = Add (Num 3) (Bert ernieMult)
resultErnie :: Ernie
resultErnie = Ernie (Num 15)
main :: IO ()
main = hspec $
describe "dendro" $ do
parallel $ it "collapses a simple syntax tree" $
collapseBertSyntaxTree bertSum `shouldBe` Num 5
parallel $ it "collapses both parts of a syntax tree" $
collapseErnieSyntaxTree ernieMult `shouldBe` resultErnie
parallel $ it "matches solution via catamorphism" $
collapseErnieSyntaxTree' ernieMult `shouldBe` collapseErnieSyntaxTree ernieMult
parallel $ it "collapses complex syntax trees" $
collapseBertSyntaxTree bertComplex `shouldBe` Num 18
parallel $ it "should work would when doubly wrapped" $
collapseErnieSyntaxTree ernieComplex `shouldBe` resultErnie