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)