module HJS.Parser.ParserMonad where


import Control.Monad.Identity
import Control.Monad.Error
import Control.Monad.State

import HJS.Parser.Lexer


data ParseResult a = Ok a | Failed String deriving Show
data LexerMode = Normal | InComment | InRegex  deriving Show
data LexerState = LS { rest::String,lineno::Int,mode::LexerMode,tr:: [String], 
		       nl:: Bool, rest2 :: String, expectRegex :: Bool, lastToken::(Maybe Token)} deriving Show

startState str = LS { rest=str, lineno=1, mode =Normal, tr=[], nl = False, rest2 = "", expectRegex = False,lastToken=Nothing}

type P  = StateT LexerState (ErrorT String Identity)

getLineNo :: P Int
getLineNo = do
                s <- get
                return $ lineno s

putLineNo :: Int -> P ()
putLineNo l = do
                 s <- get 
                 put s { lineno = l }



trace :: String -> P ()
trace ts = do 
             s  <- get 
             put s { tr = ts : (tr s) }

ifM a b c = do 
	        case a of 
		   True -> b
                   False -> c