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