module Network.Monad.Transfer.IO where

import qualified Network.Monad.Transfer as Transfer
import qualified Network.Monad.Reader as Reader

import qualified Network.TCP as TCP
import Control.Monad.Trans.Reader (ReaderT, runReaderT, )
import Control.Monad.IO.Class (MonadIO, )

import Data.Monoid (Monoid, )


transfer :: (TCP.HStream body, Monoid body, MonadIO io) =>
   TCP.HandleStream body -> Transfer.T io body
transfer :: forall body (io :: * -> *).
(HStream body, Monoid body, MonadIO io) =>
HandleStream body -> T io body
transfer HandleStream body
h =
   Transfer.Cons {
      readLine :: AsyncExceptional io body
Transfer.readLine   =         forall (io :: * -> *) a.
(MonadIO io, Monoid a) =>
IO (Result a) -> AsyncExceptional io a
Transfer.liftIOAsync forall a b. (a -> b) -> a -> b
$ forall bufType.
HStream bufType =>
HandleStream bufType -> IO (Result bufType)
TCP.readLine HandleStream body
h,
      readBlock :: Int -> AsyncExceptional io body
Transfer.readBlock  = \Int
n   -> forall (io :: * -> *) a.
(MonadIO io, Monoid a) =>
IO (Result a) -> AsyncExceptional io a
Transfer.liftIOAsync forall a b. (a -> b) -> a -> b
$ forall bufType.
HStream bufType =>
HandleStream bufType -> Int -> IO (Result bufType)
TCP.readBlock HandleStream body
h Int
n,
      writeBlock :: body -> SyncExceptional io ()
Transfer.writeBlock = \body
str -> forall (io :: * -> *) a.
MonadIO io =>
IO (Result a) -> SyncExceptional io a
Transfer.liftIOSync  forall a b. (a -> b) -> a -> b
$ forall bufType.
HStream bufType =>
HandleStream bufType -> bufType -> IO (Result ())
TCP.writeBlock HandleStream body
h body
str
   }

run :: (TCP.HStream body, Monoid body, MonadIO io) =>
   Reader.T body io a -> TCP.HandleStream body -> io a
run :: forall body (io :: * -> *) a.
(HStream body, Monoid body, MonadIO io) =>
T body io a -> HandleStream body -> io a
run T body io a
m HandleStream body
h = forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT T body io a
m forall a b. (a -> b) -> a -> b
$ forall body (io :: * -> *).
(HStream body, Monoid body, MonadIO io) =>
HandleStream body -> T io body
transfer HandleStream body
h