module Language.Noodle.Parsing.Positional
( getSt
, putSt
, modSt
, startPos
, getPos
, incPos
, incLine
, Position
, PosParser
, module Language.Noodle.Parsing.Generic) where
import Language.Noodle.Parsing.Generic hiding (getSt,putSt,modSt)
import qualified Language.Noodle.Parsing.Generic as P (getSt,putSt,modSt)
type Position = (Int,Int,Int)
type PosSt a = (Position,a)
type PosParser st tok res = GParser (PosSt st) tok res
getSt :: PosParser st tok st
getSt = do (_,st) <- P.getSt
return st
putSt :: st -> PosParser st tok ()
putSt st = do (pos,_) <- P.getSt
P.putSt (pos,st)
modSt :: (st -> st) -> PosParser st tok ()
modSt f = do st <- getSt
putSt (f st)
startPos :: Position
startPos = (1,1,1)
getPos :: PosParser st tok Position
getPos = do (pos,_) <- P.getSt
return pos
putPos :: Position -> PosParser st tok ()
putPos npos = do st <- getSt
P.putSt (npos,st)
incPos :: PosParser st tok ()
incPos = do (ab,rel,lin) <- getPos
putPos (ab+1,rel+1,lin)
incLine :: PosParser st tok ()
incLine = do (ab,_,lin) <- getPos
putPos (ab+1,1,lin+1)