module LinearScan.Context where import Debug.Trace (trace, traceShow, traceShowId) import qualified Prelude import qualified Data.IntMap import qualified Data.IntSet import qualified Data.List import qualified Data.Ord import qualified Data.Functor.Identity import qualified Hask.Utils type Context errType i o a = ([] errType) -> i -> Prelude.Either ([] errType) ((,) a o) iask :: Context a1 a2 a2 ([] a1) iask e i = Prelude.Right ((,) e i) context :: a1 -> (Context a1 a2 a3 a4) -> Context a1 a2 a3 a4 context c x e = x ((:) c e) iput :: a3 -> Context a1 a2 a3 () iput x x0 x1 = Prelude.Right ((,) () x) imap :: (a4 -> a5) -> (Context a1 a2 a3 a4) -> Context a1 a2 a3 a5 imap f x e st = case x e st of { Prelude.Left err -> Prelude.Left err; Prelude.Right p -> case p of { (,) a st' -> Prelude.Right ((,) (f a) st')}} ipure :: a3 -> Context a1 a2 a2 a3 ipure x x0 st = Prelude.Right ((,) x st) ijoin :: (Context a1 a2 a3 (Context a1 a3 a4 a5)) -> Context a1 a2 a4 a5 ijoin x e st = case x e st of { Prelude.Left err -> Prelude.Left err; Prelude.Right p -> case p of { (,) y st' -> y e st'}} ibind :: (a5 -> Context a1 a3 a4 a6) -> (Context a1 a2 a3 a5) -> Context a1 a2 a4 a6 ibind f x = ijoin (imap f x)