{-# LANGUAGE DeriveGeneric, DataKinds, DerivingVia, KindSignatures, TypeOperators #-} module Main (main) where import DerivingViaFun import Data.Monoid (Sum(..), Any(..)) import Data.Functor.Product (Product(..)) import Data.Functor.Identity (Identity(..)) import GHC.Generics (Generic) data T0 = T0 Int Bool deriving Generic deriving (Eq, Ord) via Fun (T0 ?-> (Int, Bool)) deriving (Semigroup, Monoid) via Fun (GenericIso :: T0 ~> (Sum Int, Any)) -- test type annotations in deriving via newtype All = All Bool deriving (Eq, Ord) via Fun (Coerce All Bool) deriving (Semigroup, Monoid) via Fun (Coerce All Bool >>> Not >>> Coerce Bool Any) data T1 a = T1 [a] a deriving Generic deriving (Functor, Applicative, Monad, Foldable) via Fun1 (T1 ?-> Product [] Identity) main :: IO () main = pure ()