content: {-# LANGUAGE NoImplicitPrelude #-}
  
  {-|
  Module      : Stack.Types.AddCommand
  License     : BSD-3-Clause
  -}
  
  module Stack.Types.AddCommand
    ( AddCommand
    ) where
  
  import           Control.Monad.Trans.Except ( ExceptT )
  import           Control.Monad.Writer ( Writer )
  import qualified Options.Applicative as OA
  import           Stack.Prelude
  import           Stack.Types.GlobalOptsMonoid ( GlobalOptsMonoid )
  import           Stack.Types.Runner ( Runner )
  
  -- | A type synonym for the monad used to add command line commands to Stack.
  -- The monad is a stack of an 'ExceptT' @(@t'RIO' 'Runner' @())@ monad on top of
  -- a 'Writer' @f@ monad, where @f@ is
  -- 'Options.Applicative.Mod' 'Options.Applicative.CommandFields' @(@t'RIO' 'Runner' @(),@ 'GlobalOptsMonoid'@)@ - that
  -- is, an option modifier for command options that have return type
  -- @(@t'RIO' 'Runner' @(),@ 'GlobalOptsMonoid'@)@.
  type AddCommand =
    ExceptT (RIO Runner ())
            (Writer (OA.Mod OA.CommandFields (RIO Runner (), GlobalOptsMonoid)))
            ()
  