kure-2.0.0: examples/Fib/Kure.hs
{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, FlexibleInstances #-}
module Fib.Kure where
import Control.Applicative
import Language.KURE
import Fib.AST
--------------------------------------------------------------------------------------
-- | For this simple example, the context is always empty and 'Translate' always operates on 'Arith'
type TranslateA b = Translate () Maybe Arith b
type RewriteA = TranslateA Arith
--------------------------------------------------------------------------------------
instance Term Arith where
type Generic Arith = Arith
numChildren (Lit _) = 0
numChildren (Add _ _) = 2
numChildren (Sub _ _) = 2
numChildren (Fib _) = 1
instance Walker () Maybe Arith where
childL n = lens $ \ c e -> case e of
Lit _ -> empty
Add e1 e2 -> case n of
0 -> pure ((c,e1), \ e1' -> pure (Add e1' e2))
1 -> pure ((c,e2), \ e2' -> pure (Add e1 e2'))
_ -> empty
Sub e1 e2 -> case n of
0 -> pure ((c,e1), \ e1' -> pure (Sub e1' e2))
1 -> pure ((c,e2), \ e2' -> pure (Sub e1 e2'))
_ -> empty
Fib e1 -> case n of
0 -> pure ((c,e1), \ e1' -> pure (Fib e1'))
_ -> empty
--------------------------------------------------------------------------------------