packages feed

kure-2.0.0: examples/Expr/Examples.hs

module Expr.Examples where

import Language.KURE
import Language.KURE.Injection

import Expr.AST
import Expr.Kure

-----------------------------------------------------------------

inlineR :: RewriteE Expr
inlineR = do (c, Var v) <- exposeT
             constT (lookup v c)

inlineGR :: RewriteE GenericExpr
inlineGR = promoteR inlineR

-----------------------------------------------------------------

expr1 :: Expr
expr1 = ESeq (Seq (Assign "m" (Lit 7))
                  (Assign "n" (Add (Lit 1) (Lit 2)))
             )
             (Add (Var "m")
                  (Var "n")
             )

result1 :: Expr
result1 = ESeq (Seq (Assign "m" (Lit 7))
                    (Assign "n" (Add (Lit 1) (Lit 2)))
               )
               (Add (Lit 7)
                    (Add (Lit 1) (Lit 2))
               )

test1 :: Bool
test1 = apply (extractR (anytdR inlineGR)) [] expr1 == Just result1

expr2 :: Expr
expr2 = ESeq (Seq (Assign "m" (Lit 7))
                  (Assign "n" (Add (Lit 1) (Lit 2)))
             )
             (Add (Var "m")
                  (Var "x")
             )

result2 :: Expr
result2 = ESeq (Seq (Assign "m" (Lit 7))
                    (Assign "n" (Add (Lit 1) (Lit 2)))
               )
               (Add (Lit 7)
                    (Var "x")
               )
test2 :: Bool
test2 = apply (extractR (anytdR inlineGR)) [] expr2 == Just result2

expr3 :: Expr
expr3 = ESeq (Assign "m" (Lit 7)
             )
             (Add (Var "y")
                  (Var "x")
             )

test3 :: Bool
test3 = apply (extractR (anytdR inlineGR)) [] expr3 == Nothing

-----------------------------------------------------------------

checkTests :: Bool
checkTests = and [ test1
                 , test2
                 , test3
                 ]

-----------------------------------------------------------------