module Polysemy.Http (
  -- $intro
  module Polysemy.Http.Data.Http,
  -- * Interpreters
  module Polysemy.Http.Native,
  module Polysemy.Http.Strict,
  -- * Request and Response
  module Polysemy.Http.Data.Request,
  module Polysemy.Http.Data.Response,
  module Polysemy.Http.Data.Header,
  module Polysemy.Http.Request,
  HttpError(..),
  -- * Streaming
  module Polysemy.Http.Http,
  module Polysemy.Http.Data.StreamEvent,
  -- * Entity
  EntityDecode,
  decode,
  decodeStrict,
  EntityEncode,
  encode,
  encodeStrict,
  Entities,
  Decode,
  Encode,
  Decoders,
  Encoders,
  EntityError(EntityError),
  module Polysemy.Http.AesonEntity,
  -- * Utilities
  -- ** Connection Pool
  module Polysemy.Http.Data.Manager,
  -- ** Logging
  module Polysemy.Http.Data.Log,
  module Polysemy.Http.Log,
) where

import Polysemy.Http.AesonEntity (interpretEntityDecodeAeson, interpretEntityEncodeAeson)
import Polysemy.Http.Data.Entity (
  Decode,
  Decoders,
  Encode,
  Encoders,
  Entities,
  EntityDecode,
  EntityEncode,
  EntityError(EntityError),
  decode,
  decodeStrict,
  encode,
  encodeStrict,
  )
import Polysemy.Http.Data.Header (Header(..), HeaderName(..), HeaderValue(..))
import Polysemy.Http.Data.Http (Http, request, stream)
import Polysemy.Http.Data.HttpError (HttpError(..))
import Polysemy.Http.Data.Log (Log)
import Polysemy.Http.Data.Manager (Manager)
import Polysemy.Http.Data.Request (
  Body(..),
  Host(..),
  Method(..),
  Path(..),
  Port(..),
  QueryKey(..),
  QueryValue(..),
  Request(..),
  Tls(..),
  )
import Polysemy.Http.Data.Response (
  Response(..),
  pattern Client,
  pattern Info,
  pattern Redirect,
  pattern Server,
  pattern Success,
  )
import Polysemy.Http.Data.StreamEvent (StreamEvent(..))
import Polysemy.Http.Http (streamResponse)
import Polysemy.Http.Log (interpretLogNull, interpretLogStdout)
import Polysemy.Http.Native (interpretHttpNative)
import Polysemy.Http.Request (delete, deleteUrl, get, getUrl, post, postUrl, put, putUrl)
import Polysemy.Http.Strict (interpretHttpStrict)

-- $intro
-- A basic 'Polysemy' effect abstracting HTTP requests:
--
-- @
-- import Polysemy (resourceToIO, runM)
-- import qualified Polysemy.Http as Http
-- import Polysemy.Http (interpretHttpNative, interpretLogStdout)
--
-- main :: IO ()
-- main = do
--   result <- runM $
--     resourceToIO $
--     interpretLogStdout $
--     interpretHttpNative $
--     Http.request (Http.get "hackage.haskell.org" "package\/polysemy-http")
--   print result
-- @