module LinearScan.IState where


import qualified Prelude
import qualified Data.IntMap
import qualified Data.List
import qualified Data.Ord
import qualified Data.Functor.Identity
import qualified LinearScan.Utils


type IState errType i o a = i -> Prelude.Either errType ((,) a o)

ierr :: a1 -> IState a1 a2 a3 a4
ierr err x =
  Prelude.Left err

iget :: IState a1 a2 a2 a2
iget i =
  Prelude.Right ((,) i i)

iput :: a3 -> IState a1 a2 a3 ()
iput x x0 =
  Prelude.Right ((,) () x)

imap :: (a4 -> a5) -> (IState a1 a2 a3 a4) -> IState a1 a2 a3 a5
imap f x st =
  case x st of {
   Prelude.Left err -> Prelude.Left err;
   Prelude.Right p ->
    case p of {
     (,) a st' -> Prelude.Right ((,) (f a) st')}}

ipure :: a3 -> IState a1 a2 a2 a3
ipure x st =
  Prelude.Right ((,) x st)

ijoin :: (IState a1 a2 a3 (IState a1 a3 a4 a5)) -> IState a1 a2 a4 a5
ijoin x st =
  case x st of {
   Prelude.Left err -> Prelude.Left err;
   Prelude.Right p ->
    case p of {
     (,) y st' -> y st'}}