module StateParser where import UU_Parsing newtype Input inp st s = Input (inp s,st) instance InputState inp s => InputState (Input inp state) s where splitStateE (Input (inp,st)) = case splitStateE inp of Left' x xs -> Left' x (Input (xs,st)) Right' xs -> Right' (Input (xs,st)) splitState (Input (inp,st)) = case splitState inp of (x,xs) -> (x,Input (xs,st)) firstState (Input (inp,_)) = firstState inp getPosition (Input (inp,_)) = getPosition inp class StateParser p st | p -> st where get :: p st change :: (st -> st) -> p () set :: st -> p () set x = change (const x) fconst x y = y instance (InputState inp s ,OutputState out) => StateParser (AnaParser (Input inp st) out s) st where get = pDynE (PR (rp,rr)) where f addRes k state = let steps = k state Input ~(_,st) = state in (val (addRes st) steps) rp = P f rr = R (f fconst ) change ch = pDynE (PR (rp,rr)) where f addRes k state = let steps = k (Input (inp,ch st)) Input ~(inp,st) = state in (val (addRes ()) steps) rp = P f rr = R (f fconst )