content: {-# LANGUAGE DeriveDataTypeable #-}
  
  -- | The underlying CmdArgs type.
  module System.Console.CmdArgs.Implicit.Type(
      -- cmdArgs_privateArgsSeen is exported, otherwise Haddock
      -- gets confused when using RecordWildCards
      CmdArgs(..), cmdArgsHasValue, embed, reembed,
      CmdArgsPrivate, incArgsSeen, getArgsSeen
      ) where
  
  import System.Console.CmdArgs.Verbosity
  
  import Data.Data
  import Data.Maybe
  
  
  -- | A structure to store the additional data relating to @--help@,
  --   @--version@, @--quiet@ and @--verbose@.
  data CmdArgs a = CmdArgs
      {cmdArgsValue :: a -- ^ The underlying value being wrapped.
      ,cmdArgsHelp :: Maybe String -- ^ @Just@ if @--help@ is given, then gives the help message for display, including a trailing newline.
      ,cmdArgsVersion :: Maybe String -- ^ @Just@ if @--version@ is given, then gives the version message for display, including a trailing newline.
      ,cmdArgsVerbosity :: Maybe Verbosity -- ^ @Just@ if @--quiet@ or @--verbose@ is given, then gives the verbosity to use.
      ,cmdArgsPrivate :: CmdArgsPrivate -- ^ Private: Only exported due to Haddock limitations.
      }
      deriving (Show,Eq,Ord,Data,Typeable)
  
  cmdArgsHasValue :: CmdArgs a -> Bool
  cmdArgsHasValue x = isNothing (cmdArgsHelp x) && isNothing (cmdArgsVersion x)
  
  instance Functor CmdArgs where
      fmap f x = x{cmdArgsValue = f $ cmdArgsValue x}
  
  
  embed :: a -> CmdArgs a
  embed x = CmdArgs x Nothing Nothing Nothing (CmdArgsPrivate 0)
  
  reembed :: CmdArgs a -> (a, a -> CmdArgs a)
  reembed x = (cmdArgsValue x, \y -> x{cmdArgsValue=y})
  
  
  data CmdArgsPrivate = CmdArgsPrivate
      Int -- ^ The number of arguments that have been seen
      deriving (Eq,Ord,Data,Typeable)
  
  incArgsSeen x@CmdArgs{cmdArgsPrivate = CmdArgsPrivate i} = x{cmdArgsPrivate = CmdArgsPrivate (i+1)}
  getArgsSeen CmdArgs{cmdArgsPrivate = CmdArgsPrivate i} = i
  
  instance Show CmdArgsPrivate where show _ = "CmdArgsPrivate"
  