    {-# 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 -- return the old state
      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]]