{-# LANGUAGE TypeOperators #-} module Main where import Data.OI hiding (isEOF) import Data.Char import System.IO main :: IO () main = run $ pmain1 pmain0 = forces . mapOI echo pmain1 = forces . echos eof :: Int eof = -1 getc :: Int :-> Int getc = iooi getchar putc :: Char -> () :-> () putc = iooi . putChar putc' :: Int -> () :-> () putc' (-1) = const () putc' c = iooi (putChar (chr c)) gets :: [Int] :-> String gets = map chr . takeWhile (eof /=) . mapOI getc puts :: String -> [()] :-> [()] puts = zipWithOI' putc getchar :: IO Int getchar = choice (return (-1)) (return . ord =<< getChar) =<< isEOF puts' :: String -> OI [()] -> () puts' = seqsOI' . map putc echo = getc |/| putc' echos = gets |/| puts