packages feed

natskell-0.0.0.1: internal/Plumbing/Pipeline/Streaming/Source.hs

module Pipeline.Streaming.Source where
import           Conduit
import           Data.ByteString
import           Lib.Logger.Types      (LogLevel (..), MonadLogger (..))
import           Network.ConnectionAPI (ReaderAPI (..))
import           Prelude               hiding (length, null)

source :: (MonadLogger m , MonadIO m)
  => ReaderAPI reader
  -> reader
  -> ConduitT () ByteString m ()
source readerApi reader = do
  lift . logMessage Debug $ "reading from connection"
  result <- liftIO $ readData readerApi reader 4096
  case result of
    Left err -> do
      lift . logMessage Info $ ("read failed: " ++ err)
    Right chunk -> do
      case null chunk of
        True -> do
          lift . logMessage Info $ "read returned empty chunk; treating as disconnect"
          return ()
        _ -> do
          lift . logMessage Debug $ ("read " ++ show (length chunk) ++ " bytes")
          yield chunk
          source readerApi reader