polysemy-http-0.6.0.0: lib/Polysemy/Http/Interpreter/Pure.hs
{-# options_haddock prune #-}
-- |Description: Pure Http Interpreters, Internal
module Polysemy.Http.Interpreter.Pure where
import Network.HTTP.Client.Internal (CookieJar (CJ))
import Polysemy.Internal.Tactics (liftT)
import Polysemy.Http.Data.Response (Response (Response))
import qualified Polysemy.Http.Effect.Http as Http
import Polysemy.Http.Effect.Http (Http)
takeResponse ::
Member (State [Response LByteString]) r =>
[Response LByteString] ->
Sem r (Response LByteString)
takeResponse (response : rest) =
response <$ put rest
takeResponse [] =
pure (Response (toEnum 502) "test responses exhausted" [] (CJ mempty))
takeChunk ::
Member (State [ByteString]) r =>
[ByteString] ->
Sem r ByteString
takeChunk (chunk : rest) =
chunk <$ put rest
takeChunk [] =
pure ""
interpretHttpPureWithState ::
Members [State [ByteString], State [Response LByteString], Embed IO] r =>
InterpreterFor (Http LByteString) r
interpretHttpPureWithState =
interpretH \case
Http.Response _ f -> do
res <- liftT . takeResponse =<< raise get
fmap Right <$> bindTSimple f res
Http.Request _ ->
liftT . fmap Right . takeResponse =<< raise get
Http.Stream _ handler -> do
handle <- bindT handler
res <- liftT . takeResponse =<< raise get
fmap Right <$> raise (interpretHttpPureWithState (handle res))
Http.ConsumeChunk _ ->
liftT . fmap Right . takeChunk =<< raise get
{-# inline interpretHttpPureWithState #-}
-- |In-Memory interpreter for 'Http'.
interpretHttpPure ::
Member (Embed IO) r =>
-- |When a request is made, one response is popped of the list and returned.
-- If the list is exhausted, a 502 response is returned.
[Response LByteString] ->
-- |Chunks used for streaming responses.
[ByteString] ->
InterpretersFor [Http LByteString, State [Response LByteString], State [ByteString]] r
interpretHttpPure responses chunks =
evalState chunks .
evalState responses .
interpretHttpPureWithState
{-# inline interpretHttpPure #-}