{-# LANGUAGE TypeOperators #-} module Main where import Data.OI import Data.Char import System.IO main :: IO () main = do { [] <- run $ puts |<| gets; return () } eof :: Int eof = -1 getc :: Int :-> Int getc = iooi getchar putc :: Char -> () :-> () putc = iooi . putChar gets :: [Int] :-> String gets = map chr . takeWhile (eof /=) . mapOI getc puts :: String -> [()] :-> [()] puts s = dropWhile (()==) . snd . zipWithOI' putc s choice :: a -> a -> Bool -> a choice t f c = if c then t else f getchar :: IO Int getchar = choice (return (-1)) (return . ord =<< getChar) =<< isEOF puts' :: String -> [()] :-> () puts' = sequenceOI . map putc