    {-# LANGUAGE CPP #-}
    {-|
    Module:      Text.Show.Deriving
    Copyright:   (C) 2015-2017 Ryan Scott
    License:     BSD-style (see the file LICENSE)
    Maintainer:  Ryan Scott
    Portability: Template Haskell

    Exports functions to mechanically derive 'Show', 'Show1', and 'Show2' instances.
    -}
    module Text.Show.Deriving (
          -- * 'Show'
          deriveShow
        , deriveShowOptions
        , makeShowsPrec
        , makeShowsPrecOptions
        , makeShow
        , makeShowOptions
        , makeShowList
        , makeShowListOptions
          -- * 'Show1'
        , deriveShow1
        , deriveShow1Options
    #if defined(NEW_FUNCTOR_CLASSES)
        , makeLiftShowsPrec
        , makeLiftShowsPrecOptions
        , makeLiftShowList
        , makeLiftShowListOptions
    #endif
        , makeShowsPrec1
        , makeShowsPrec1Options
    #if defined(NEW_FUNCTOR_CLASSES)
          -- * 'Show2'
        , deriveShow2
        , deriveShow2Options
        , makeLiftShowsPrec2
        , makeLiftShowsPrec2Options
        , makeLiftShowList2
        , makeLiftShowList2Options
        , makeShowsPrec2
        , makeShowsPrec2Options
    #endif
          -- * 'ShowOptions'
        , ShowOptions(..)
        , defaultShowOptions
        , legacyShowOptions
          -- * 'deriveShow' limitations
          -- $constraints
        ) where

    import Text.Show.Deriving.Internal

    {- $constraints

    Be aware of the following potential gotchas:

    * Type variables of kind @*@ are assumed to have 'Show' constraints.
      Type variables of kind @* -> *@ are assumed to have 'Show1' constraints.
      Type variables of kind @* -> * -> *@ are assumed to have 'Show2' constraints.
      If this is not desirable, use 'makeShowsPrec' or one of its cousins.

    * The 'Show1' class had a different definition in @transformers-0.4@, and as a result,
      'deriveShow1' implements different instances for the @transformers-0.4@ 'Show1' than
      it otherwise does. Also, 'makeLiftShowsPrec' and 'makeLiftShowList' are not available
      when this library is built against @transformers-0.4@, only 'makeShowsPrec1.

    * The 'Show2' class is not available in @transformers-0.4@, and as a
      result, neither are Template Haskell functions that deal with 'Show2' when this
      library is built against @transformers-0.4@.
    -}