deriving-compat-0.5.6: Backports of GHC deriving extensions

Data.Deriving.Via.Internal

Description

On template-haskell-2.12 or later (i.e., GHC 8.2 or later), this module exports functionality which emulates the GeneralizedNewtypeDeriving and DerivingVia GHC extensions (the latter of which was introduced in GHC 8.6).

On older versions of template-haskell/GHC, this module does not export anything.

Note: this is an internal module, and as such, the API presented here is not guaranteed to be stable, even between minor releases of this library.

Synopsis

# Documentation

Generates an instance for a type class at a newtype by emulating the behavior of the GeneralizedNewtypeDeriving extension. For example:

newtype Foo a = MkFoo a
$(deriveGND [t| forall a. Eq a => Eq (Foo a) |])  Generates an instance for a type class by emulating the behavior of the DerivingVia extension. For example: newtype Foo a = MkFoo a$(deriveVia [t| forall a. Ord a => Ord (Foo a) Via Down a |])


As shown in the example above, the syntax is a tad strange. One must specify the type by which to derive the instance using the Via type. This requirement is in place to ensure that the type variables are scoped correctly across all the types being used (e.g., to make sure that the same a is used in Ord a, Ord (Foo a), and Down a).

Arguments

 :: Type The instance head (e.g., Eq (Foo a)) -> Maybe Type If using deriveGND, this is 'Nothing. If using deriveVia, this is Just the via type. -> Q [Dec]

deriveViaDecs' :: Name -> [TyVarBndr] -> [Type] -> Type -> Dec -> Q (Maybe [Dec]) Source #

changeLast :: [a] -> a -> [a] Source #

Replace the last element of a list with another element.