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)