{-# LANGUAGE OverloadedStrings #-} module Jikka.Core.Convert.ShortCutFusionSpec (spec) where import Jikka.Common.Alpha import Jikka.Common.Error import Jikka.Core.Convert.ShortCutFusion (run) import Jikka.Core.Language.BuiltinPatterns import Jikka.Core.Language.Expr import Test.Hspec run' :: Program -> Either Error Program run' = flip evalAlphaT 0 . run spec :: Spec spec = describe "run" $ do it "works" $ do let prog = ResultExpr $ Len' IntTy (Map' IntTy IntTy (Lam "n" IntTy (Mult' (LitInt' 2) (Var "n"))) (Range1' (LitInt' 100))) let expected = ResultExpr $ LitInt' 100 run' prog `shouldBe` Right expected it "squashes foldl-map combination" $ do let g = Lam2 "a" IntTy "i" IntTy (Plus' (Var "a") (Var "i")) let f = Lam "j" IntTy (Plus' (Var "j") Lit1) let prog = ResultExpr $ Foldl' IntTy IntTy g Lit0 $ Map' IntTy IntTy f $ Range1' (LitInt' 100) let expected = ResultExpr $ Foldl' IntTy IntTy (Lam2 "$0" IntTy "$1" IntTy (App2 g (Var "$0") (App f (Var "$1")))) Lit0 $ Range1' (LitInt' 100) run' prog `shouldBe` Right expected