    {-# LANGUAGE CPP #-}
    {-|
    Module:      Data.Ord.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 'Ord', 'Ord1', and 'Ord2' instances.
    -}
    module Data.Ord.Deriving (
          -- * 'Ord'
          deriveOrd
        , makeCompare
        , makeLT
        , makeLE
        , makeGT
        , makeGE
        , makeMax
        , makeMin
          -- * 'Ord1'
        , deriveOrd1
    #if defined(NEW_FUNCTOR_CLASSES)
        , makeLiftCompare
    #endif
        , makeCompare1
    #if defined(NEW_FUNCTOR_CLASSES)
          -- * 'Ord2'
        , deriveOrd2
        , makeLiftCompare2
        , makeCompare2
    #endif
          -- * 'deriveOrd' limitations
          -- $constraints
        ) where

    import Data.Ord.Deriving.Internal

    {- $constraints

    Be aware of the following potential gotchas:

    * Type variables of kind @*@ are assumed to have 'Ord' constraints.
      Type variables of kind @* -> *@ are assumed to have 'Ord1' constraints.
      Type variables of kind @* -> * -> *@ are assumed to have 'Ord2' constraints.
      If this is not desirable, use 'makeCompare' or one of its cousins.

    * The 'Ord1' class had a different definition in @transformers-0.4@, and as a result,
      'deriveOrd1' implements different instances for the @transformers-0.4@ 'Ord1' than
      it otherwise does. Also, 'makeLiftCompare' is not available
      when this library is built against @transformers-0.4@, only 'makeCompare1.

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