{-# 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@.
-}