module Data.RangeMin.LCA.IndexM (Index, IndexM, getIndex, execIndexM) where

import Data.RangeMin.Common.Types hiding (IP)

data IP a = IP a {-# UNPACK #-} !Index
newtype IndexM a = IndexM {runIndexM :: Index -> IP a}

instance Monad IndexM where
	return a = IndexM (IP a)
	m >>= k = IndexM $ \ i -> case runIndexM m i of
		IP x i' -> runIndexM (k x) i'

getIndex :: IndexM Index
getIndex = IndexM $ \ i -> IP i (i+1)

execIndexM :: IndexM a -> (a, Length)
execIndexM m = case runIndexM m 0 of
	IP a n -> (a, n)