packages feed

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