-- | Constant names that are used throughout the plugin.
module Control.Super.Plugin.Names
  ( -- * Types
    PluginModuleName
  , PluginClassName
    -- * Supermonad Module Names
  , supermonadModuleName
  , supermonadCtModuleName
  , legacySupermonadModuleName
  , legacySupermonadCtModuleName
  , supermonadPreludeModuleName
  , supermonadCtPreludeModuleName
  , legacySupermonadPreludeModuleName
  , legacySupermonadCtPreludeModuleName
  , functorModuleName
    -- * Supermonad Class Names
  , bindClassName
  , returnClassName
  , functorClassName
  , applicativeClassName
    -- * Superarrow Module Names
  , superarrowModuleName
  , superarrowCtModuleName
    -- * Superarrow Class Names
  , arrowArrClassName
  , arrowSequenceClassName
  , arrowSelectClassName
  , arrowParallelClassName
  , arrowFanOutClassName
  ) where

-- | Type of module names the plugin uses.
type PluginModuleName = String

-- | Type of class names the plugin uses.
type PluginClassName = String  

-- -----------------------------------------------------------------------------
-- Constant Supermonad Names (Magic Numbers...)
-- -----------------------------------------------------------------------------

-- | Name of the "Control.Supermonad" module.
legacySupermonadModuleName :: PluginModuleName
legacySupermonadModuleName = "Control.Supermonad"

-- | Name of the "Control.Super.Monad" module.
supermonadModuleName :: PluginModuleName
supermonadModuleName = "Control.Super.Monad"

-- | Name of the "Control.Supermonad.Constrained" module.
legacySupermonadCtModuleName :: PluginModuleName
legacySupermonadCtModuleName = "Control.Supermonad.Constrained"

-- | Name of the "Control.Super.Monad.Constrained" module.
supermonadCtModuleName :: PluginModuleName
supermonadCtModuleName = "Control.Super.Monad.Constrained"

-- | Name of the @Bind@ type class.
--   Also used as dictionary key for the @Bind@ class.
bindClassName :: PluginClassName
bindClassName = "Bind"

-- | Name of the @Return@ type class.
--   Also used as dictionary key for the @Return@ class.
returnClassName :: PluginClassName
returnClassName = "Return"

-- | Name of the @Functor@ class.
--   Also used as dictionary key for the @Functor@ class.
functorClassName :: PluginClassName
functorClassName = "Functor"

-- | Name of the @Applicative@ type class.
--   Also used as dictionary key for the @Applicative@ class.
applicativeClassName :: PluginClassName
applicativeClassName = "Applicative"

-- | Name of the "Control.Supermonad.Prelude" module.
legacySupermonadPreludeModuleName :: PluginModuleName
legacySupermonadPreludeModuleName = "Control.Supermonad.Prelude"

-- | Name of the "Control.Super.Monad.Prelude" module.
supermonadPreludeModuleName :: PluginModuleName
supermonadPreludeModuleName = "Control.Super.Monad.Prelude"

-- | Name of the "Control.Supermonad.Constrained.Prelude" module.
legacySupermonadCtPreludeModuleName :: PluginModuleName
legacySupermonadCtPreludeModuleName = "Control.Supermonad.Constrained.Prelude"

-- | Name of the "Control.Super.Monad.Constrained.Prelude" module.
supermonadCtPreludeModuleName :: PluginModuleName
supermonadCtPreludeModuleName = "Control.Super.Monad.Constrained.Prelude"

-- | Name of the "Data.Functor" module.
functorModuleName :: PluginModuleName
functorModuleName = "Data.Functor"

-- -----------------------------------------------------------------------------
-- Constant Superarrow Names (Magic Numbers...)
-- -----------------------------------------------------------------------------

-- | Name of the "Control.Super.Arrow" module.
superarrowModuleName :: PluginModuleName
superarrowModuleName = "Control.Super.Arrow"

-- | Name of the "Control.Super.Arrow.Constrained" module.
superarrowCtModuleName :: PluginModuleName
superarrowCtModuleName = "Control.Super.Arrow.Constrained"

-- | Name of the @ArrowArr@ type class.
--   Also used as dictionary key for the @ArrowArr@ class.
arrowArrClassName :: PluginClassName
arrowArrClassName = "ArrowArr"

-- | Name of the @ArrowSequence@ class.
--   Also used as dictionary key for the @ArrowSequence@ class.
arrowSequenceClassName :: PluginClassName
arrowSequenceClassName = "ArrowSequence"

-- | Name of the @ArrowSelect@ type class.
--   Also used as dictionary key for the @ArrowSelect@ class.
arrowSelectClassName :: PluginClassName
arrowSelectClassName = "ArrowSelect"

-- | Name of the @ArrowParallel@ class.
--   Also used as dictionary key for the @ArrowParallel@ class.
arrowParallelClassName :: PluginClassName
arrowParallelClassName = "ArrowParallel"

-- | Name of the @ArrowFanOut@ class.
--   Also used as dictionary key for the @ArrowFanOut@ class.
arrowFanOutClassName :: PluginClassName
arrowFanOutClassName = "ArrowFanOut"