    {-# LANGUAGE CPP #-}
    {-|
    Module:      Text.Read.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 'Read', 'Read1', and 'Read2' instances.
    -}
    module Text.Read.Deriving (
          -- * 'Read'
          deriveRead
        , deriveReadOptions
        , makeReadsPrec
    --     , makeReadsPrecOptions
    --     , makeReadList
    --     , makeReadListOptions
        , makeReadPrec
    --     , makeReadPrecOptions
    --     , makeReadListPrec
    --     , makeReadListPrecOptions
          -- * 'Read1'
        , deriveRead1
        , deriveRead1Options
    #if defined(NEW_FUNCTOR_CLASSES)
        , makeLiftReadsPrec
    --     , makeLiftReadsPrecOptions
    --     , makeLiftReadList
    --     , makeLiftReadListOptions
    # if __GLASGOW_HASKELL__ >= 801
        , makeLiftReadPrec
    --     , makeLiftReadPrecOptions
    --     , makeLiftReadListPrec
    --     , makeLiftReadListPrecOptions
        , makeReadPrec1
    --     , makeReadPrec1Options
    # endif
    #endif
        , makeReadsPrec1
    --     , makeReadsPrec1Options
    #if defined(NEW_FUNCTOR_CLASSES)
          -- * 'Read2'
        , deriveRead2
        , deriveRead2Options
        , makeLiftReadsPrec2
    --     , makeLiftReadsPrec2Options
    --     , makeLiftReadList2
    --     , makeLiftReadList2Options
    # if __GLASGOW_HASKELL__ >= 801
        , makeLiftReadPrec2
    --     , makeLiftReadPrec2Options
    --     , makeLiftReadListPrec2
    --     , makeLiftReadListPrec2Options
        , makeReadPrec2
    --     , makeReadPrec2Options
    # endif
        , makeReadsPrec2
    --     , makeReadsPrec2Options
    #endif
          -- * 'ReadOptions'
        , ReadOptions(..)
        , defaultReadOptions
          -- * 'deriveRead' limitations
          -- $constraints
        ) where

    import Text.Read.Deriving.Internal

    {- $constraints

    Be aware of the following potential gotchas:

    * Type variables of kind @*@ are assumed to have 'Read' constraints.
      Type variables of kind @* -> *@ are assumed to have 'Read1' constraints.
      Type variables of kind @* -> * -> *@ are assumed to have 'Read2' constraints.
      If this is not desirable, use 'makeReadsPrec' or one of its cousins.

    * The 'Read1' class had a different definition in @transformers-0.4@, and as a result,
      'deriveRead1' implements different instances for the @transformers-0.4@ 'Read1' than
      it otherwise does. Also, 'makeLiftReadsPrec' and 'makeLiftReadList' are not available
      when this library is built against @transformers-0.4@, only 'makeReadsPrec1.

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

    * The 'Read1' and 'Read2' classes have new methods ('liftReadPrec'/'liftReadListPrec'
      and 'liftReadPrec2'/'liftReadListPrec2', respectively) that were introduced in
      @base-4.10@. For now, these methods are only defined when deriving 'Read1'/'Read2'
      if built against @base-4.10@ (until @transformers-compat@ catches up), and
      the corresponding @make-@ functions are also only available when built against
      @base-4.10@.
    -}