module IO where import ST type MyState s = (s, String, String) type MyIO s a = ST (MyState s) a unitIO :: a -> MyIO s a unitIO = unitST bindIO :: MyIO s a -> (a -> MyIO s b) -> MyIO s b bindIO = bindST setIO :: Pos s a -> a -> MyIO s () setIO p v = \ (s, i, o) -> ((), (snd (p s) v, i, o)) getIO :: Pos s a -> MyIO s a getIO p = \ (s, i, o) -> (fst (p s), (s, i, o)) readIO :: () -> MyIO s Char readIO () = \ (s, c:cs, o) -> (c, (s, cs, o)) eofIO :: () -> MyIO s Bool eofIO () = \ (s, i, o) -> (null i, (s, i, o)) writeIO :: Show v => v -> MyIO s () writeIO v = \ (s, i, o) -> ((), (s, i, o ++ show v)) putStrIO :: String -> MyIO s () putStrIO o' = \ (s, i, o) -> ((), (s, i, o ++ o')) fst3 (x, _, _) = x snd3 (_, y, _) = y thd3 (_, _, z) = z atoi :: String -> Integer atoi = read atof :: String -> Double atof = read