module Servant.Checked.Exceptions
  (
  -- * 'Throws' API parameter
    Throws
  -- * 'Envelope' response wrapper
  , Envelope(..)
  -- ** 'Envelope' helper functions
  -- *** 'Envelope' constructors
  , toSuccEnvelope
  , toErrEnvelope
  , pureSuccEnvelope
  , pureErrEnvelope
  -- *** 'Envelope' destructors
  , envelope
  , fromEnvelope
  , fromEnvelopeOr
  , fromEnvelopeM
  , fromEnvelopeOrM
  , errEnvelopeMatch
  , catchesEnvelope
  -- *** 'Envelope' optics
  , _SuccEnvelope
  , _ErrEnvelope
  , _ErrEnvelopeErr
  -- *** 'Envelope' and 'Either'
  , envelopeToEither
  , eitherToEnvelope
  , isoEnvelopeEither
  -- *** 'OpenUnion' (used in 'ErrEnvelope')
  , OpenUnion
  -- **** 'OpenUnion' Helpers
  , openUnion
  , fromOpenUnion
  , fromOpenUnionOr
  , openUnionPrism
  , openUnionLift
  , openUnionMatch
  , catchesOpenUnion
  -- **** 'Union' (used by 'OpenUnion')
  -- | 'OpenUnion' is a type synonym around 'Union'. Most users will be able to
  -- work directly with 'OpenUnion' and ignore this 'Union' type.
  , Union(..)
  -- ***** Union helpers
  , union
  , absurdUnion
  , umap
  , catchesUnion
  -- ***** Union optics
  , _This
  , _That
  -- ***** Typeclasses used with Union
  , Nat(Z, S)
  , RIndex
  , UElem(..)
  , IsMember
  -- **** 'OpenProduct' (used by 'OpenUnion')
  -- | This 'Product' type is used to easily create a case-analysis for
  -- 'Union's.  You can see it being used in 'catchesOpenUnion' and
  -- 'catchesEnvelope'.  The 'ToProduct' type class makes it easy to convert a
  -- tuple to a 'Product'.  This makes it so the end user only has to worry
  -- about working with tuples, and can mostly ignore this 'Product' type.
  , OpenProduct
  , Product(..)
  , ToOpenProduct
  , tupleToOpenProduct
  , ToProduct
  , tupleToProduct
  , ReturnX
  ) where

import Servant.Checked.Exceptions.Internal