oi-0.0.2: sample/echo.hs
{-# 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