flite-0.1: Flite/Identify.hs
module Flite.Identify where
import Flite.Syntax
import Flite.Traversals
import Flite.Descend
-- Rewrites (Var n) to (Fun n) where n refers to a function.
identifyFuncs :: Prog -> Prog
identifyFuncs p =
[Func f xs (fun (concatMap patVars xs) e) | Func f xs e <- p]
where
fs = funcs p
fun vs (Case e as) =
Case (fun vs e) [(p, fun (vs ++ patVars p) e) | (p, e) <- as]
fun vs (Let bs e) =
let ws = vs ++ map fst bs
in Let [(v, fun ws e) | (v, e) <- bs] (fun ws e)
fun vs (Var v) | v `elem` fs && v `notElem` vs = Fun v
fun vs e = descend (fun vs) e