-- | Streams using `T.Text` by encoding in Utf 8.
module Network.Text.Stream
    (
    Result(..),
    Stream,

    invalidate,
    withStream,
    write,

    receive,
    receiveE
    )
where

import Control.Monad.IO.Class
import qualified Data.Enumerator as E
import qualified Data.Enumerator.List as EL
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Network.ByteString.Stream as S
import Network.ByteString.Stream (Result(..), Stream, invalidate, withStream)
import System.IO

-- | Writes partial or full data over a `Stream`, placing it in the queue of
-- data to be sent. Encodes the `Data.Text.Text` with Utf8
-- into a strict `Data.ByteString.ByteString`.
write :: Stream -> T.Text -> IO ()
write s t = S.write s (T.encodeUtf8 t)

-- | Receives the entire data should the transfer over the stream be successful.
-- Returns `Nothing` on failure.
receive :: Handle -> IO (Maybe T.Text)
receive h = do bytesM <- S.receive h
               case bytesM of
                Nothing -> return Nothing
                Just bytes -> return . Just $ T.decodeUtf8 bytes

-- | Run an iteratee through an enumerator which supplies each block of Text.
receiveE :: MonadIO m => Handle -> E.Iteratee T.Text m b -> m (Maybe b)
receiveE h iter = let iter' = EL.map T.decodeUtf8 E.=$ iter
                  in S.receiveE h iter'