haskell/sc-mini-pfp/Supercompiler.hs

module Supercompiler where

import Data
import DataUtil
import Generator
import Folding
import Driving
import Prototype
import Deforester

supercompile :: Task -> Task
supercompile (e, p) =
  residuate $ simplify $ foldTree $ buildFTree (addPropagation $ driveMachine p) e

addPropagation :: Machine Conf -> Machine Conf
addPropagation m ns e = propagateContract (m ns e)

propagateContract :: Step Conf -> Step Conf
propagateContract (Variants vs) =
  Variants [(c, e // [(v, Ctr cn $ map Var vs)]) |
            (c@(Contract v (Pat cn vs)), e) <- vs]
propagateContract step = step