{-# LANGUAGE
    OverloadedStrings
  #-}

module Network.Wai.Middleware.ContentType.Blaze where

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

import qualified Text.Blaze.Html                         as H
import qualified Text.Blaze.Html.Renderer.Utf8           as H
import qualified Data.HashMap.Lazy                       as HM


-- * Lifted Combinators

blaze :: Monad m =>
         H.Html
      -> FileExtListenerT urlbase m ()
blaze :: forall (m :: * -> *) urlbase.
Monad m =>
Html -> FileExtListenerT urlbase m ()
blaze Html
i =
  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
Html forall a b. (a -> b) -> a -> b
$
    forall a.
a
-> Status
-> ResponseHeaders
-> (a -> Status -> ResponseHeaders -> Response)
-> ResponseVia
ResponseVia
      Html
i
      Status
status200
      [(HeaderName
"Content-Type", ByteString
"text/html")]
      Html -> Status -> ResponseHeaders -> Response
blazeOnly

{-# INLINEABLE blaze #-}

-- * Data Only

blazeOnly :: H.Html -> Status -> ResponseHeaders -> Response
blazeOnly :: Html -> Status -> ResponseHeaders -> Response
blazeOnly Html
h Status
s ResponseHeaders
hs = Status -> ResponseHeaders -> Builder -> Response
responseBuilder Status
s ResponseHeaders
hs (Html -> Builder
H.renderHtmlBuilder Html
h)