free-http-0.1.0.1: src/Network/HTTP/Client/Free/PureClient.hs
{-| A pure interepreter
-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
module Network.HTTP.Client.Free.PureClient (
runHttp
, runTHttp
) where
import Control.Monad.Trans (MonadTrans)
import Control.Monad.Trans.Free.Church (FT, iterT, iterTM, liftF)
import Network.HTTP.Client (Manager, Request, Response,
httpLbs)
import Network.HTTP.Client.Free.Types (HttpF (HttpF), RequestType,
ResponseType)
-------------------------------------------------------------------------------
-- | Peel a layer of the 'HttpF' functor and, given the pure, mock function
-- that maps requests to responses, run the next method against the returned
-- request.
iterTHttp :: (Monad m)
=> (RequestType client -> ResponseType client)
-- ^ a function to mock requests
-> HttpF client (m a)
-> m a
iterTHttp mock (HttpF _ req next) = next (mock req)
-------------------------------------------------------------------------------
-- | Peel a layer of the 'HttpF' functor and, given the pure, mock function
-- that maps requests to responses, run the next method against the returned
-- request. the base monad for this action is `t m a`
iterTMHttp :: (Monad m, MonadTrans t, Monad (t m))
=> (RequestType client -> ResponseType client)
-> HttpF client (t m a)
-> t m a
iterTMHttp mock (HttpF _ req next) = next (mock req)
-------------------------------------------------------------------------------
-- | A pure interpreter based on a client-supplied mocking function
runHttp :: Monad m
=> ignore
-- ^ a parameter that will be ignored. It is included so client's can
-- hot-swap interpreters (many will require a `Manager` type)
-> (RequestType client -> ResponseType client)
-> FT (HttpF client) m a
-> m a
runHttp _ mock = iterT (iterTHttp mock)
-------------------------------------------------------------------------------
-- | A pure interpreter based on a client-supplied mocking function. The under-
-- lying monad is `t m`, so computations will be lifted into `t m`.
runTHttp :: (Monad m, MonadTrans t, Monad (t m))
=> ignore
-- ^ a paramter that will be ignored. It is included so client's can
-- host-swap interpreters (many will require a 'Manager' type)
-> (RequestType client -> ResponseType client)
-> FT (HttpF client) m a
-> t m a
runTHttp _ mock = iterTM (iterTMHttp mock)