module Network.Wai.Middleware.ContentType.ByteString where

import           Network.Wai.Middleware.ContentType.Types (FileExtListenerT, tell', getLogger, FileExt, ResponseVia (..))
import           Network.HTTP.Types                      (status200, Status, ResponseHeaders)
import           Network.Wai                             (Response, responseLBS)

import qualified Data.ByteString.Lazy                    as LBS
import qualified Data.HashMap.Lazy                       as HM
import           Control.Monad.IO.Class (MonadIO (..))


-- * Lifted Combinators

bytestring :: Monad m =>
              FileExt
           -> LBS.ByteString
           -> FileExtListenerT urlbase m ()
bytestring :: forall (m :: * -> *) urlbase.
Monad m =>
FileExt -> ByteString -> FileExtListenerT urlbase m ()
bytestring FileExt
fe ByteString
i = do
  Status -> Maybe Integer -> IO ()
aplogger <- forall (m :: * -> *) urlbase.
Monad m =>
FileExtListenerT urlbase m (Status -> Maybe Integer -> IO ())
getLogger
  forall w (m :: * -> *). (Monoid w, MonadState w m) => w -> m ()
tell' forall a b. (a -> b) -> a -> b
$ forall k v. Hashable k => k -> v -> HashMap k v
HM.singleton FileExt
fe forall a b. (a -> b) -> a -> b
$
    forall a.
a
-> Status
-> ResponseHeaders
-> (a -> Status -> ResponseHeaders -> Response)
-> ResponseVia
ResponseVia
      ByteString
i
      Status
status200
      []
      ByteString -> Status -> ResponseHeaders -> Response
bytestringOnly

{-# INLINEABLE bytestring #-}


-- * Data Only

-- | The exact same thing as @Network.Wai.responseLBS@.
bytestringOnly :: LBS.ByteString -> Status -> ResponseHeaders -> Response
bytestringOnly :: ByteString -> Status -> ResponseHeaders -> Response
bytestringOnly ByteString
b Status
s ResponseHeaders
hs = Status -> ResponseHeaders -> ByteString -> Response
responseLBS Status
s ResponseHeaders
hs ByteString
b