{-# LANGUAGE MagicHash,
UnboxedTuples,
ScopedTypeVariables #-}
module UU.Parsing.StateParser(StateParser(..)) where
import GHC.Prim
import UU.Parsing.MachineInterface
import UU.Parsing.Machine(AnaParser, ParsRec(..),RealParser(..),RealRecogn(..), mkPR, anaDynE)
instance (InputState inp s p) => InputState (inp, state) s p where
splitStateE (inp, st) = case splitStateE inp of
Left' x xs -> Left' x (xs, st)
Right' xs -> Right' (xs, st)
splitState (inp, st) = case splitState inp of
(# x,xs #) -> (# x, (xs, st) #)
getPosition (inp, _) = getPosition inp
class StateParser p st | p -> st where
change :: (st -> st) -> p st
set :: st -> p st
set x = change (const x)
get :: p st
get = change id
fconst x y = y
instance (InputState inp s p ,OutputState out) =>
StateParser (AnaParser (inp, st) out s p) st where
get = anaDynE (mkPR (rp,rr))
where f addRes k state = (val (addRes (snd state)) (k state))
rp = P f
rr = R (f fconst )
change ch = anaDynE (mkPR (rp,rr))
where f addRes k state = case state of (inp, st) -> val (addRes st) (k (inp, ch st))
rp = P f
rr = R (f fconst)
newtype Errors s p = Errors [[Message s p]]