{-# OPTIONS_GHC -Wno-redundant-constraints #-}

-- | Provides dynamic network effects.
--
-- @since 0.1
module Effectful.HTTP.Client.Dynamic
  ( -- * Effect
    Network (..),

    -- ** Handlers
    runNetwork,

    -- * Manager
    newManager,

    -- ** TLS
    newTlsManager,
    newTlsManagerWith,
    applyDigestAuth,

    -- * Queries
    BodyReader,
    withResponse,
    withResponseHistory,

    -- * Consumers
    brRead,
    brReadSome,
    brConsume,

    -- * Helpers
    readResponseJson,
    readResponseUtf8,
    readResponse,

    -- * Exceptions
    NetworkStatusE (..),
    NetworkReadBodyE (..),
    NetworkDecodeUtf8E (..),
    NetworkDecodeJsonE (..),

    -- * Re-exports
    ManagerSettings,
    Manager,
    Request,
    Response,
  )
where

import Control.Monad.Catch (MonadThrow)
import Data.Aeson (FromJSON)
import Data.ByteString (ByteString)
import Data.ByteString.Lazy (LazyByteString)
import Data.Text (Text)
import Effectful
  ( Dispatch (Dynamic),
    DispatchOf,
    Eff,
    Effect,
    IOE,
    UnliftStrategy (SeqUnlift),
    type (:>),
  )
import Effectful.Dispatch.Dynamic
  ( localLiftUnlift,
    localSeqUnlift,
    reinterpret,
    send,
  )
import Effectful.Dynamic.Utils (ShowEffect (showEffectCons))
import Effectful.HTTP.Client.Internal
  ( NetworkDecodeJsonE (MkNetworkDecodeJsonE),
    NetworkDecodeUtf8E (MkNetworkDecodeUtf8E),
    NetworkReadBodyE (MkNetworkReadBodyE),
    NetworkStatusE (MkNetworkStatusE),
  )
import Effectful.HTTP.Client.Internal qualified as Internal
import Effectful.HTTP.Client.Static qualified as Static
import GHC.Stack.Types (HasCallStack)
import Network.HTTP.Client
  ( HistoriedResponse,
    Manager,
    ManagerSettings,
    Request,
    Response,
  )

-- | @since 0.1
type instance DispatchOf Network = Dynamic

-- | Dynamic effect for network effects.
--
-- @since 0.1
data Network :: Effect where
  -- Setup
  NewManager :: ManagerSettings -> Network m Manager
  -- Tls
  NewTlsManager :: Network m Manager
  NewTlsManagerWith :: ManagerSettings -> Network m Manager
  ApplyDigestAuth ::
    forall m n.
    (MonadThrow n) =>
    ByteString ->
    ByteString ->
    Request ->
    Manager ->
    Network m (n Request)
  -- Queries
  WithResponse ::
    Request ->
    Manager ->
    (Response (BodyReader m) -> m a) ->
    Network m a
  WithResponseHistory ::
    Request ->
    Manager ->
    (HistoriedResponse (BodyReader m) -> m a) ->
    Network m a
  -- Consumers
  BrRead :: BodyReader m -> Network m ByteString
  BrReadSome :: BodyReader m -> Int -> Network m LazyByteString
  BrConsume :: BodyReader m -> Network m [ByteString]

-- | @since 0.1
type BodyReader m = m ByteString

-- | @since 0.1
instance ShowEffect Network where
  showEffectCons :: forall (m :: * -> *) a. Network m a -> String
showEffectCons = \case
    NewManager ManagerSettings
_ -> String
"NewManager"
    Network m a
NewTlsManager -> String
"NewTlsManager"
    NewTlsManagerWith ManagerSettings
_ -> String
"NewTlsManagerWith"
    ApplyDigestAuth {} -> String
"ApplyDigestAuth"
    WithResponse {} -> String
"WithResponse"
    WithResponseHistory {} -> String
"WithResponseHistory"
    BrRead BodyReader m
_ -> String
"BrRead"
    BrReadSome {} -> String
"BrReadSome"
    BrConsume BodyReader m
_ -> String
"BrConsume"

-- | Runs 'Network' in 'IO'.
--
-- @since 0.1
runNetwork ::
  forall a es.
  ( HasCallStack,
    IOE :> es
  ) =>
  -- | .
  Eff (Network : es) a ->
  Eff es a
runNetwork :: forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, IOE :> es) =>
Eff (Network : es) a -> Eff es a
runNetwork = (Eff (Network : es) a -> Eff es a)
-> EffectHandler Network (Network : es)
-> Eff (Network : es) a
-> Eff es a
forall (e :: (* -> *) -> * -> *)
       (handlerEs :: [(* -> *) -> * -> *]) a (es :: [(* -> *) -> * -> *])
       b.
(HasCallStack, DispatchOf e ~ 'Dynamic) =>
(Eff handlerEs a -> Eff es b)
-> EffectHandler e handlerEs -> Eff (e : es) a -> Eff es b
reinterpret Eff (Network : es) a -> Eff es a
forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, IOE :> es) =>
Eff (Network : es) a -> Eff es a
Static.runNetwork (EffectHandler Network (Network : es)
 -> Eff (Network : es) a -> Eff es a)
-> EffectHandler Network (Network : es)
-> Eff (Network : es) a
-> Eff es a
forall a b. (a -> b) -> a -> b
$ \LocalEnv localEs
env -> \case
  NewManager ManagerSettings
s -> ManagerSettings -> Eff (Network : es) Manager
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
ManagerSettings -> Eff es Manager
Static.newManager ManagerSettings
s
  Network (Eff localEs) a
NewTlsManager -> Eff (Network : es) a
Eff (Network : es) Manager
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Eff es Manager
Static.newTlsManager
  NewTlsManagerWith ManagerSettings
s -> ManagerSettings -> Eff (Network : es) Manager
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
ManagerSettings -> Eff es Manager
Static.newTlsManagerWith ManagerSettings
s
  ApplyDigestAuth ByteString
b1 ByteString
b2 Request
r Manager
m -> ByteString
-> ByteString
-> Request
-> Manager
-> Eff (Network : es) (n Request)
forall (n :: * -> *) (es :: [(* -> *) -> * -> *]).
(HasCallStack, MonadThrow n, Network :> es) =>
ByteString
-> ByteString -> Request -> Manager -> Eff es (n Request)
Static.applyDigestAuth ByteString
b1 ByteString
b2 Request
r Manager
m
  WithResponse Request
r Manager
m Response (BodyReader (Eff localEs)) -> Eff localEs a
k -> LocalEnv localEs
-> UnliftStrategy
-> ((forall r. Eff (Network : es) r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall (localEs :: [(* -> *) -> * -> *])
       (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
LocalEnv localEs
-> UnliftStrategy
-> ((forall r. Eff es r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff es r) -> Eff es a)
-> Eff es a
localLiftUnlift LocalEnv localEs
env UnliftStrategy
SeqUnlift (((forall r. Eff (Network : es) r -> Eff localEs r)
  -> (forall r. Eff localEs r -> Eff (Network : es) r)
  -> Eff (Network : es) a)
 -> Eff (Network : es) a)
-> ((forall r. Eff (Network : es) r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff (Network : es) r -> Eff localEs r
lift forall r. Eff localEs r -> Eff (Network : es) r
unlift ->
    Request
-> Manager
-> (Response (BodyReader (Eff (Network : es)))
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Request
-> Manager
-> (Response (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
Static.withResponse Request
r Manager
m (Eff localEs a -> Eff (Network : es) a
forall r. Eff localEs r -> Eff (Network : es) r
unlift (Eff localEs a -> Eff (Network : es) a)
-> (Response (BodyReader (Eff (Network : es))) -> Eff localEs a)
-> Response (BodyReader (Eff (Network : es)))
-> Eff (Network : es) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Response (BodyReader (Eff localEs)) -> Eff localEs a
k (Response (BodyReader (Eff localEs)) -> Eff localEs a)
-> (Response (BodyReader (Eff (Network : es)))
    -> Response (BodyReader (Eff localEs)))
-> Response (BodyReader (Eff (Network : es)))
-> Eff localEs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BodyReader (Eff (Network : es)) -> BodyReader (Eff localEs))
-> Response (BodyReader (Eff (Network : es)))
-> Response (BodyReader (Eff localEs))
forall a b. (a -> b) -> Response a -> Response b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BodyReader (Eff (Network : es)) -> BodyReader (Eff localEs)
forall r. Eff (Network : es) r -> Eff localEs r
lift)
  WithResponseHistory Request
r Manager
m HistoriedResponse (BodyReader (Eff localEs)) -> Eff localEs a
k -> LocalEnv localEs
-> UnliftStrategy
-> ((forall r. Eff (Network : es) r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall (localEs :: [(* -> *) -> * -> *])
       (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
LocalEnv localEs
-> UnliftStrategy
-> ((forall r. Eff es r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff es r) -> Eff es a)
-> Eff es a
localLiftUnlift LocalEnv localEs
env UnliftStrategy
SeqUnlift (((forall r. Eff (Network : es) r -> Eff localEs r)
  -> (forall r. Eff localEs r -> Eff (Network : es) r)
  -> Eff (Network : es) a)
 -> Eff (Network : es) a)
-> ((forall r. Eff (Network : es) r -> Eff localEs r)
    -> (forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff (Network : es) r -> Eff localEs r
lift forall r. Eff localEs r -> Eff (Network : es) r
unlift ->
    Request
-> Manager
-> (HistoriedResponse (BodyReader (Eff (Network : es)))
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Request
-> Manager
-> (HistoriedResponse (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
Static.withResponseHistory Request
r Manager
m (Eff localEs a -> Eff (Network : es) a
forall r. Eff localEs r -> Eff (Network : es) r
unlift (Eff localEs a -> Eff (Network : es) a)
-> (HistoriedResponse (BodyReader (Eff (Network : es)))
    -> Eff localEs a)
-> HistoriedResponse (BodyReader (Eff (Network : es)))
-> Eff (Network : es) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HistoriedResponse (BodyReader (Eff localEs)) -> Eff localEs a
k (HistoriedResponse (BodyReader (Eff localEs)) -> Eff localEs a)
-> (HistoriedResponse (BodyReader (Eff (Network : es)))
    -> HistoriedResponse (BodyReader (Eff localEs)))
-> HistoriedResponse (BodyReader (Eff (Network : es)))
-> Eff localEs a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BodyReader (Eff (Network : es)) -> BodyReader (Eff localEs))
-> HistoriedResponse (BodyReader (Eff (Network : es)))
-> HistoriedResponse (BodyReader (Eff localEs))
forall a b. (a -> b) -> HistoriedResponse a -> HistoriedResponse b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BodyReader (Eff (Network : es)) -> BodyReader (Eff localEs)
forall r. Eff (Network : es) r -> Eff localEs r
lift)
  BrRead BodyReader (Eff localEs)
br -> LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall (localEs :: [(* -> *) -> * -> *])
       (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a
localSeqUnlift LocalEnv localEs
env (((forall r. Eff localEs r -> Eff (Network : es) r)
  -> Eff (Network : es) a)
 -> Eff (Network : es) a)
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff localEs r -> Eff (Network : es) r
unlift -> BodyReader (Eff (Network : es)) -> BodyReader (Eff (Network : es))
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> BodyReader (Eff es)
Static.brRead (BodyReader (Eff localEs) -> BodyReader (Eff (Network : es))
forall r. Eff localEs r -> Eff (Network : es) r
unlift BodyReader (Eff localEs)
br)
  BrReadSome BodyReader (Eff localEs)
br Int
n -> LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall (localEs :: [(* -> *) -> * -> *])
       (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a
localSeqUnlift LocalEnv localEs
env (((forall r. Eff localEs r -> Eff (Network : es) r)
  -> Eff (Network : es) a)
 -> Eff (Network : es) a)
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff localEs r -> Eff (Network : es) r
unlift -> BodyReader (Eff (Network : es))
-> Int -> Eff (Network : es) ByteString
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Int -> Eff es ByteString
Static.brReadSome (BodyReader (Eff localEs) -> BodyReader (Eff (Network : es))
forall r. Eff localEs r -> Eff (Network : es) r
unlift BodyReader (Eff localEs)
br) Int
n
  BrConsume BodyReader (Eff localEs)
br -> LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall (localEs :: [(* -> *) -> * -> *])
       (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
LocalEnv localEs
-> ((forall r. Eff localEs r -> Eff es r) -> Eff es a) -> Eff es a
localSeqUnlift LocalEnv localEs
env (((forall r. Eff localEs r -> Eff (Network : es) r)
  -> Eff (Network : es) a)
 -> Eff (Network : es) a)
-> ((forall r. Eff localEs r -> Eff (Network : es) r)
    -> Eff (Network : es) a)
-> Eff (Network : es) a
forall a b. (a -> b) -> a -> b
$ \forall r. Eff localEs r -> Eff (Network : es) r
unlift -> BodyReader (Eff (Network : es)) -> Eff (Network : es) [ByteString]
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Eff es [ByteString]
Static.brConsume (BodyReader (Eff localEs) -> BodyReader (Eff (Network : es))
forall r. Eff localEs r -> Eff (Network : es) r
unlift BodyReader (Eff localEs)
br)

-- | @since 0.1
newManager ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  ManagerSettings ->
  Eff es Manager
newManager :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
ManagerSettings -> Eff es Manager
newManager = Network (Eff es) Manager -> Eff es Manager
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) Manager -> Eff es Manager)
-> (ManagerSettings -> Network (Eff es) Manager)
-> ManagerSettings
-> Eff es Manager
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ManagerSettings -> Network (Eff es) Manager
forall (m :: * -> *). ManagerSettings -> Network m Manager
NewManager

-- | @since 0.1
newTlsManager ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  Eff es Manager
newTlsManager :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Eff es Manager
newTlsManager = Network (Eff es) Manager -> Eff es Manager
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send Network (Eff es) Manager
forall (m :: * -> *). Network m Manager
NewTlsManager

-- | @since 0.1
newTlsManagerWith ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  ManagerSettings ->
  Eff es Manager
newTlsManagerWith :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
ManagerSettings -> Eff es Manager
newTlsManagerWith = Network (Eff es) Manager -> Eff es Manager
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) Manager -> Eff es Manager)
-> (ManagerSettings -> Network (Eff es) Manager)
-> ManagerSettings
-> Eff es Manager
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ManagerSettings -> Network (Eff es) Manager
forall (m :: * -> *). ManagerSettings -> Network m Manager
NewTlsManagerWith

-- | @since 0.1
applyDigestAuth ::
  forall n es.
  ( HasCallStack,
    MonadThrow n,
    Network :> es
  ) =>
  -- | .
  ByteString ->
  ByteString ->
  Request ->
  Manager ->
  Eff es (n Request)
applyDigestAuth :: forall (n :: * -> *) (es :: [(* -> *) -> * -> *]).
(HasCallStack, MonadThrow n, Network :> es) =>
ByteString
-> ByteString -> Request -> Manager -> Eff es (n Request)
applyDigestAuth ByteString
b1 ByteString
b2 Request
r = Network (Eff es) (n Request) -> Eff es (n Request)
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) (n Request) -> Eff es (n Request))
-> (Manager -> Network (Eff es) (n Request))
-> Manager
-> Eff es (n Request)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString
-> ByteString -> Request -> Manager -> Network (Eff es) (n Request)
forall (m :: * -> *) (n :: * -> *).
MonadThrow n =>
ByteString
-> ByteString -> Request -> Manager -> Network m (n Request)
ApplyDigestAuth ByteString
b1 ByteString
b2 Request
r

-- | @since 0.1
withResponse ::
  forall a es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  Request ->
  Manager ->
  (Response (BodyReader (Eff es)) -> Eff es a) ->
  Eff es a
withResponse :: forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Request
-> Manager
-> (Response (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
withResponse Request
r Manager
m = Network (Eff es) a -> Eff es a
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) a -> Eff es a)
-> ((Response (BodyReader (Eff es)) -> Eff es a)
    -> Network (Eff es) a)
-> (Response (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request
-> Manager
-> (Response (BodyReader (Eff es)) -> Eff es a)
-> Network (Eff es) a
forall (m :: * -> *) a.
Request
-> Manager -> (Response (BodyReader m) -> m a) -> Network m a
WithResponse Request
r Manager
m

-- | @since 0.1
withResponseHistory ::
  forall a es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  Request ->
  Manager ->
  (HistoriedResponse (BodyReader (Eff es)) -> Eff es a) ->
  Eff es a
withResponseHistory :: forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
Request
-> Manager
-> (HistoriedResponse (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
withResponseHistory Request
r Manager
m = Network (Eff es) a -> Eff es a
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) a -> Eff es a)
-> ((HistoriedResponse (BodyReader (Eff es)) -> Eff es a)
    -> Network (Eff es) a)
-> (HistoriedResponse (BodyReader (Eff es)) -> Eff es a)
-> Eff es a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request
-> Manager
-> (HistoriedResponse (BodyReader (Eff es)) -> Eff es a)
-> Network (Eff es) a
forall (m :: * -> *) a.
Request
-> Manager
-> (HistoriedResponse (BodyReader m) -> m a)
-> Network m a
WithResponseHistory Request
r Manager
m

-- | @since 0.1
brRead ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  BodyReader (Eff es) ->
  Eff es ByteString
brRead :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> BodyReader (Eff es)
brRead = Network (Eff es) ByteString -> Eff es ByteString
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) ByteString -> Eff es ByteString)
-> (Eff es ByteString -> Network (Eff es) ByteString)
-> Eff es ByteString
-> Eff es ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Eff es ByteString -> Network (Eff es) ByteString
forall (m :: * -> *). BodyReader m -> Network m ByteString
BrRead

-- | @since 0.1
brReadSome ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  BodyReader (Eff es) ->
  Int ->
  Eff es LazyByteString
brReadSome :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Int -> Eff es ByteString
brReadSome BodyReader (Eff es)
br = Network (Eff es) ByteString -> Eff es ByteString
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) ByteString -> Eff es ByteString)
-> (Int -> Network (Eff es) ByteString) -> Int -> Eff es ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BodyReader (Eff es) -> Int -> Network (Eff es) ByteString
forall (m :: * -> *). BodyReader m -> Int -> Network m ByteString
BrReadSome BodyReader (Eff es)
br

-- | @since 0.1
brConsume ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | .
  BodyReader (Eff es) ->
  Eff es [ByteString]
brConsume :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Eff es [ByteString]
brConsume = Network (Eff es) [ByteString] -> Eff es [ByteString]
forall (e :: (* -> *) -> * -> *) (es :: [(* -> *) -> * -> *]) a.
(HasCallStack, DispatchOf e ~ 'Dynamic, e :> es) =>
e (Eff es) a -> Eff es a
send (Network (Eff es) [ByteString] -> Eff es [ByteString])
-> (BodyReader (Eff es) -> Network (Eff es) [ByteString])
-> BodyReader (Eff es)
-> Eff es [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BodyReader (Eff es) -> Network (Eff es) [ByteString]
forall (m :: * -> *). BodyReader m -> Network m [ByteString]
BrConsume

-- | Helper for reading a response, checking for status 200 and exceptions
-- thrown by the consumer.
--
-- @since 0.1
readResponse ::
  forall a es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | String url.
  String ->
  -- | Response.
  Response (BodyReader (Eff es)) ->
  -- | Consumer.
  (BodyReader (Eff es) -> Eff es a) ->
  Eff es a
readResponse :: forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es a)
-> Eff es a
readResponse = String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es a)
-> Eff es a
forall br (es :: [(* -> *) -> * -> *]) a.
HasCallStack =>
String -> Response br -> (br -> Eff es a) -> Eff es a
Internal.readResponse

-- | Helper for reading a response, decoding to UTF-8.
--
-- @since 0.1
readResponseUtf8 ::
  forall es.
  ( HasCallStack,
    Network :> es
  ) =>
  -- | String url.
  String ->
  -- | Response.
  Response (BodyReader (Eff es)) ->
  Eff es Text
readResponseUtf8 :: forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
String -> Response (BodyReader (Eff es)) -> Eff es Text
readResponseUtf8 String
url Response (BodyReader (Eff es))
res =
  String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es [ByteString])
-> Eff es [ByteString]
forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es a)
-> Eff es a
readResponse String
url Response (BodyReader (Eff es))
res BodyReader (Eff es) -> Eff es [ByteString]
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Eff es [ByteString]
brConsume Eff es [ByteString] -> ([ByteString] -> Eff es Text) -> Eff es Text
forall a b. Eff es a -> (a -> Eff es b) -> Eff es b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [ByteString] -> Eff es Text
forall (es :: [(* -> *) -> * -> *]).
HasCallStack =>
[ByteString] -> Eff es Text
Internal.decodeUtf8

-- | Helper for reading a response, decoding JSON.
readResponseJson ::
  forall a es.
  ( FromJSON a,
    HasCallStack,
    Network :> es
  ) =>
  -- | String url.
  String ->
  -- | Response.
  Response (BodyReader (Eff es)) ->
  Eff es a
readResponseJson :: forall a (es :: [(* -> *) -> * -> *]).
(FromJSON a, HasCallStack, Network :> es) =>
String -> Response (BodyReader (Eff es)) -> Eff es a
readResponseJson String
url Response (BodyReader (Eff es))
res =
  String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es [ByteString])
-> Eff es [ByteString]
forall a (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
String
-> Response (BodyReader (Eff es))
-> (BodyReader (Eff es) -> Eff es a)
-> Eff es a
readResponse String
url Response (BodyReader (Eff es))
res BodyReader (Eff es) -> Eff es [ByteString]
forall (es :: [(* -> *) -> * -> *]).
(HasCallStack, Network :> es) =>
BodyReader (Eff es) -> Eff es [ByteString]
brConsume Eff es [ByteString] -> ([ByteString] -> Eff es a) -> Eff es a
forall a b. Eff es a -> (a -> Eff es b) -> Eff es b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [ByteString] -> Eff es a
forall a (es :: [(* -> *) -> * -> *]).
(FromJSON a, HasCallStack) =>
[ByteString] -> Eff es a
Internal.decodeJson