module Lang.Hask.Execution where

import FP

import Lang.Hask.Semantics
import MAAM
import Lang.Hask.CPS

class 
  ( PartialOrder (ς Call)
  , JoinLattice (ς Call)
  , Difference (ς Call)
  , Inject ς'
  , MonadStep ς' m
  , Isomorphism (ς' Call) (ς Call)
  ) => Execution ς ς' m | m -> ς, m -> ς'

exec :: forall ς ς' ν   m. (Analysis ν   m, Execution ς ς' m) => P m -> Call -> ς Call
exec m = collect (isoto . mstepγP m call . isofrom) . (isoto :: ς' Call -> ς Call) . inj

execDiffs :: forall ς ς' ν   m. (Analysis ν   m, Execution ς ς' m) => P m -> Call -> [ς Call]
execDiffs m = collectDiffs (isoto . mstepγP m call . isofrom) . (isoto :: ς' Call -> ς Call) . inj