module Control.Proxy.Prelude.IO (
getLineS,
getLineC,
readLnS,
readLnC,
printB,
printD,
printU,
putStrLnB,
putStrLnD,
putStrLnU,
promptS,
promptC,
hGetLineD,
hGetLineU,
hPrintB,
hPrintD,
hPrintU,
hPutStrLnB,
hPutStrLnD,
hPutStrLnU
) where
import Control.Monad (forever)
import Control.Monad.Trans.Class (lift)
import Control.Proxy.Prelude.Kleisli (foreverK)
import Control.Proxy.Core (Proxy, Client, Server)
import Control.Proxy.Class (request, respond)
import System.IO (Handle, hGetLine, hPutStr, hPutStrLn, hPrint, stdin, stdout)
getLineS :: y' -> Proxy x' x y' String IO r
getLineS _ = forever $ do
str <- lift getLine
respond str
getLineC :: y' -> Proxy String x y' y IO r
getLineC _ = forever $ do
str <- lift getLine
request str
readLnS :: (Read a) => y' -> Proxy x' x y' a IO r
readLnS _ = forever $ do
a <- lift readLn
respond a
readLnC :: (Read a) => y' -> Proxy a x y' y IO r
readLnC _ = forever $ do
a <- lift readLn
request a
printB :: (Show a, Show a') => a' -> Proxy a' a a' a IO r
printB = foreverK $ \a' -> do
lift $ do
putStr "U: "
print a'
a <- request a'
lift $ do
putStr "D: "
print a
respond a
printD :: (Show a) => x -> Proxy x a x a IO r
printD = foreverK $ \x -> do
a <- request x
lift $ print a
respond a
printU :: (Show a') => a' -> Proxy a' x a' x IO r
printU = foreverK $ \a' -> do
lift $ print a'
x <- request a'
respond x
putStrLnB :: String -> Proxy String String String String IO r
putStrLnB = foreverK $ \a' -> do
lift $ do
putStr "U: "
putStrLn a'
a <- request a'
lift $ do
putStr "D: "
putStrLn a
respond a
putStrLnD :: x -> Proxy x String x String IO r
putStrLnD = foreverK $ \x -> do
a <- request x
lift $ putStrLn a
respond a
putStrLnU :: String -> Proxy String x String x IO r
putStrLnU = foreverK $ \a' -> do
lift $ putStrLn a'
x <- request a'
respond x
promptS :: String -> Proxy x' x String String IO r
promptS = foreverK $ \send -> do
recv <- lift $ do
putStrLn send
getLine
respond recv
promptC :: y' -> Proxy String String y' y IO r
promptC _ = forever $ do
send <- lift getLine
recv <- request send
lift $ putStrLn recv
hGetLineD :: Handle -> y' -> Proxy x' x y' String IO r
hGetLineD h _ = forever $ do
str <- lift $ hGetLine h
respond str
hGetLineU :: Handle -> y' -> Proxy String x y' y IO r
hGetLineU h _ = forever $ do
str <- lift $ hGetLine h
request str
hPrintB :: (Show a, Show a') => Handle -> a' -> Proxy a' a a' a IO r
hPrintB h = foreverK $ \a' -> do
lift $ do
hPutStr h "U: "
hPrint h a'
a <- request a'
lift $ do
hPutStr h "D: "
hPrint h a
respond a
hPrintD :: (Show a) => Handle -> x -> Proxy x a x a IO r
hPrintD h = foreverK $ \x -> do
a <- request x
lift $ hPrint h a
respond a
hPrintU :: (Show a') => Handle -> a' -> Proxy a' x a' x IO r
hPrintU h = foreverK $ \a' -> do
lift $ hPrint h a'
x <- request a'
respond x
hPutStrLnB :: Handle -> String -> Proxy String String String String IO r
hPutStrLnB h = foreverK $ \a' -> do
lift $ do
hPutStr h "U: "
hPutStrLn h a'
a <- request a'
lift $ do
hPutStr h "D: "
hPutStrLn h a
respond a
hPutStrLnD :: Handle -> x -> Proxy x String x String IO r
hPutStrLnD h = foreverK $ \x -> do
a <- request x
lift $ hPutStrLn h a
respond a
hPutStrLnU :: Handle -> String -> Proxy String x String x IO r
hPutStrLnU h = foreverK $ \a' -> do
lift $ hPutStrLn h a'
x <- request a'
respond x