{-# LANGUAGE UndecidableInstances #-}
module Generic.Type.Function.FoldMap where
import DeFun.Core ( type (~>), type (@@) )
import Data.Kind ( type Type )
import GHC.Generics
type GTFoldMapC
:: (m ~> m ~> m)
-> m
-> (Type ~> m)
-> (k -> Type)
-> m
type family GTFoldMapC tmappend tmempty f gf where
GTFoldMapC tmappend tmempty f U1 = tmempty
GTFoldMapC tmappend tmempty f (K1 i c) = f @@ c
GTFoldMapC tmappend tmempty f (l :*: r) = tmappend
@@ GTFoldMapC tmappend tmempty f l
@@ GTFoldMapC tmappend tmempty f r
GTFoldMapC tmappend tmempty f (M1 _ _ gf) = GTFoldMapC tmappend tmempty f gf