deriving-compat-0.6.2: Backports of GHC deriving extensions
Copyright(C) 2015-2017 Ryan Scott
LicenseBSD-style (see the file LICENSE)
MaintainerRyan Scott
PortabilityTemplate Haskell
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Ord.Deriving

Description

Exports functions to mechanically derive Ord, Ord1, and Ord2 instances. Note that upstream GHC does not have the ability to derive Ord1 or Ord2 instances, but since the functionality to derive Ord extends very naturally Ord1 and Ord2, the ability to derive the latter two classes is provided as a convenience.

Synopsis

Ord

deriveOrd :: Name -> Q [Dec] Source #

Generates an OrdClass instance declaration for the given data type or data family instance.

makeCompare :: Name -> Q Exp Source #

Generates a lambda expression which behaves like compare (without requiring an OrdClass instance).

makeLT :: Name -> Q Exp Source #

Generates a lambda expression which behaves like (<) (without requiring an OrdClass instance).

makeLE :: Name -> Q Exp Source #

Generates a lambda expression which behaves like (<=) (without requiring an OrdClass instance).

makeGT :: Name -> Q Exp Source #

Generates a lambda expression which behaves like (>) (without requiring an OrdClass instance).

makeGE :: Name -> Q Exp Source #

Generates a lambda expression which behaves like (>=) (without requiring an OrdClass instance).

makeMax :: Name -> Q Exp Source #

Generates a lambda expression which behaves like max (without requiring an OrdClass instance).

makeMin :: Name -> Q Exp Source #

Generates a lambda expression which behaves like min (without requiring an OrdClass instance).

Ord1

deriveOrd1 :: Name -> Q [Dec] Source #

Generates an Ord1 instance declaration for the given data type or data family instance.

makeLiftCompare :: Name -> Q Exp Source #

Generates a lambda expression which behaves like liftCompare (without requiring an Ord1 instance).

This function is not available with transformers-0.4.

makeCompare1 :: Name -> Q Exp Source #

Generates a lambda expression which behaves like compare1 (without requiring an Ord1 instance).

Ord2

deriveOrd2 :: Name -> Q [Dec] Source #

Generates an Ord2 instance declaration for the given data type or data family instance.

This function is not available with transformers-0.4.

makeLiftCompare2 :: Name -> Q Exp Source #

Generates a lambda expression which behaves like liftCompare2 (without requiring an Ord2 instance).

This function is not available with transformers-0.4.

makeCompare2 :: Name -> Q Exp Source #

Generates a lambda expression which behaves like compare2 (without requiring an Ord2 instance).

This function is not available with transformers-0.4.

deriveOrd limitations

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.