{-| The primary Free Monad wrapping HTTP actions.
-}

{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TypeFamilies #-}

module Network.HTTP.Client.Free.Types (
    -- * Type Familes
      RequestType
    , ResponseType

    -- * The base functor of our library
    , HttpF(HttpF)

    -- * Type aliases
    , FreeHttp
) where

import Control.Monad.Trans.Free.Church (FT)
import Network.HTTP.Types.Method (StdMethod)

-- | type family to represent the request type foundation
type family RequestType  client :: *

-- | type family to represent the response type foundation
type family ResponseType client :: *

-- | Our functor from which the free-http free monad is generated from.
data HttpF client a = HttpF StdMethod (RequestType client) (ResponseType client -> a)
                    deriving Functor

-- | a type alias for the free monad generated by 'HttpF'
type FreeHttp client m a = FT (HttpF client) m a