packages feed

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