module LinearScan.Cursor where


import Debug.Trace (trace, traceShow)
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 LinearScan.Utils

import qualified LinearScan.Interval as Interval
import qualified LinearScan.Morph as Morph
import qualified LinearScan.ScanState as ScanState


__ :: any
__ = Prelude.error "Logical or arity value used"

curId :: Prelude.Int -> ScanState.ScanStateDesc -> (,) ScanState.IntervalId
         Prelude.Int
curId maxReg sd =
  Prelude.head (ScanState.unhandled maxReg sd)

curIntDetails :: Prelude.Int -> ScanState.ScanStateDesc ->
                 Interval.IntervalDesc
curIntDetails maxReg sd =
  LinearScan.Utils.nth (ScanState.nextInterval maxReg sd)
    (ScanState.intervals maxReg sd) (Prelude.fst (curId maxReg sd))

curPosition :: Prelude.Int -> ScanState.ScanStateDesc -> Prelude.Int
curPosition maxReg sd =
  Interval.intervalStart ( (curIntDetails maxReg sd))

withCursor :: Prelude.Int -> ScanState.ScanStateDesc ->
              (ScanState.ScanStateDesc -> () -> Morph.SState () a1 a2) ->
              Morph.SState () a1 a2
withCursor maxReg pre f x =
  case x of {
   Morph.Build_SSInfo thisDesc _ ->
    f thisDesc __ (Morph.Build_SSInfo thisDesc __)}