{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# OPTIONS_GHC -fplugin Data.Constraint.Deriving #-}
{-# OPTIONS_GHC -fplugin-opt Data.Constraint.Deriving:dump-instances #-}
module Spec.DeriveAll03 where
import Data.Constraint.Deriving
{-
Here I test three different things:
* Deriving instances for the types defined elsewhere
(including the base library);
it should produce a lot of instances for all transitively
reachable modules.
* Closed, injective type families - should not be a problem.
* Higher-kinded types;
The following should produce instances for kind `Type`
(e.g. Show, Monoid)
as well as for kind `Type -> Type`
(e.g. Functor, Monad)
-}
data ListTy
data MaybeTy
type family FooFam m = r | r -> m where
FooFam ListTy = []
FooFam MaybeTy = Maybe
{-# ANN type BazTy DeriveAll #-}
newtype BazTy m a = BazCon (FooFam m a)