{-# LANGUAGE DeriveFunctor #-}
module Hreq.Core.Client.RunClient where
import Hreq.Core.Client.ClientError
import Hreq.Core.Client.Request
import Hreq.Core.Client.Response
class Monad m => RunClient m where
runClient :: Request -> m Response
throwHttpError :: ClientError -> m a
checkResponse :: Request -> Response -> m (Maybe ClientError)
class Monad m => RunStreamingClient m a where
withStreamingClient
:: forall r. Request
-> (a -> IO r)
-> m r
data ClientPure (state :: k) a
= RunClient Request a
| Throw ClientError
deriving (Functor, Show, Eq)
instance Monad (ClientPure state) where
return = pure
m >>= f = case m of
RunClient r x -> setHttpRequest r $ f x
Throw e -> Throw e
instance Applicative (ClientPure state) where
pure = RunClient defaultRequest
f <*> x = case x of
Throw e -> Throw e
RunClient r y -> setHttpRequest r $ fmap ( $ y) f
setHttpRequest :: Request -> ClientPure state a -> ClientPure state a
setHttpRequest r h = case h of
RunClient _ rs -> RunClient r rs
Throw e -> Throw e