-- | Module      : Control.FX
--   Description : Root module for the trans-fx-core effect framework
--   Copyright   : 2019, Automattic, Inc.
--   License     : BSD3
--   Maintainer  : Nathan Bloomfield (nbloomf@gmail.com)
--   Stability   : experimental
--   Portability : POSIX

module Control.FX (
  -- * Effect Classes
    MonadIdentity(..)
  , MonadHalt(..)
  , MonadExcept(..)
  , MonadState(..)
  , MonadWriteOnly(..)
  , MonadReadOnly(..)
  , MonadAppendOnly(..)
  , MonadWriteOnce(..)
  , MonadPrompt(..)


  -- * Concrete Types
  -- ** Monads
  , Identity(..)
  , Compose(..)
  , ReadOnly(..)
  , State(..)
  , Except(..)
  , WriteOnly(..)
  , Halt(..)
  , AppendOnly(..)
  , WriteOnce(..)

  -- ** Transformers
  , IdentityT(..)
  , runIdentityT
  , ComposableT(..)
  , ComposeT(..)
  , ReadOnlyT(..)
  , runReadOnlyT
  , StateT(..)
  , runStateT
  , HaltT(..)
  , runHaltT
  , ExceptT(..)
  , runExceptT
  , WriteOnlyT(..)
  , runWriteOnlyT
  , WriteOnceT(..)
  , runWriteOnceT
  , AppendOnlyT(..)
  , runAppendOnlyT

  -- ** Transformer Transformers
  , IdentityTT(..)
  , runIdentityTT
  , PromptTT(..)
  , runPromptTT
  , Eval(..)
  , OverTT(..)
  , runOverTT
  , OverableT(..)
  , StateTT(..)
  , runStateTT
  , ReadOnlyTT(..)
  , runReadOnlyTT
  , WriteOnlyTT(..)
  , runWriteOnlyTT
  , ExceptTT(..)
  , runExceptTT
  , HaltTT(..)
  , runHaltTT
  , AppendOnlyTT(..)
  , runAppendOnlyTT
  , WriteOnceTT(..)
  , runWriteOnceTT


  -- * Values In Context
  -- ** Monads
  , RunMonad(..)
  , Input(..)
  , Output(..)

  -- ** Transformers
  , RunMonadTrans(..)
  , InputT(..)
  , OutputT(..)

  -- ** Transformer Transformers
  , RunMonadTransTrans(..)
  , InputTT(..)
  , OutputTT(..)

  -- ** Equality
  , EqIn(..)
  , Context(..)


  -- * Specialized Lifts
  , Catch
  , LiftCatch(..)
  , LiftCatchT(..)
  , Draft
  , LiftDraft(..)
  , LiftDraftT(..)
  , Local
  , LiftLocal(..)
  , LiftLocalT(..)


  -- * Misc
  , Commutant(..)
  , Central(..)
  , Bifunctor(..)

  , Wrap(..)
  , Renaming(..)

  , Pair(..)

  , LeftZero(..)
  , RightZero(..)
  , IsMaybe(..)

  , MonadTrans(..)
  , MonadFunctor(..)
  , MonadTransTrans(..)
) where

import Control.FX.EqIn
import Control.FX.Functor
import Control.FX.Monad
import Control.FX.Monad.Trans
import Control.FX.Monad.Trans.Trans