packages feed

minion-conduit-0.1.0.0: src/Web/Minion/Examples/Conduit/UpperCase.hs

module Web.Minion.Examples.Conduit.UpperCase (app) where

import Data.Binary.Put qualified as Binary
import Data.Conduit ((.|))
import Data.Conduit.Combinators qualified as Conduit
import Data.Functor (($>))
import Data.Text qualified as Text
import Data.Text.IO qualified as Text.IO
import Web.Minion
import Web.Minion.Conduit

app :: ApplicationM IO
app = serve api

api :: Router Void IO
api = "api" /> "conduit" /> streamBodyBytes .> handle POST upperCase

upperCase :: ConduitRequest IO -> IO ConduitResponse
upperCase (ConduitRequest source) = pure $ ConduitResponse do
  source
    .| Conduit.decodeUtf8
    .| Conduit.map Text.toUpper
    .| Conduit.mapM (\a -> Text.IO.putStrLn a $> a)
    .| Conduit.encodeUtf8
    .| Conduit.map (Binary.execPut . Binary.putByteString)