{-# LANGUAGE AllowAmbiguousTypes  #-} -- due to tag type class design
{-# LANGUAGE UndecidableInstances #-} -- required below GHC 9.6

module Generic.Data.Function.FoldMap.NonSum where

import GHC.Generics
import Generic.Data.Function.FoldMap.Constructor
  ( GFoldMapC(gFoldMapC)
  , GenericFoldMap(type GenericFoldMapM) )
import Generic.Data.Rep.Error

{- | 'foldMap' over generic product data types.

Take a generic representation, map each field in the data type to a 'Monoid',
and combine the results with ('<>').
-}
class GFoldMapNonSum tag f where gFoldMapNonSum :: f p -> GenericFoldMapM tag

instance GFoldMapC tag f => GFoldMapNonSum tag (C1 c f) where
    gFoldMapNonSum :: forall (p :: k). C1 c f p -> GenericFoldMapM tag
gFoldMapNonSum (M1 f p
a) = forall (tag :: k) (f :: k -> Type) (p :: k).
GFoldMapC tag f =>
f p -> GenericFoldMapM tag
forall {k} {k1} (tag :: k) (f :: k1 -> Type) (p :: k1).
GFoldMapC tag f =>
f p -> GenericFoldMapM tag
gFoldMapC @tag f p
a

instance GFoldMapNonSum tag (l :+: r) where gFoldMapNonSum :: forall (p :: k). (:+:) l r p -> GenericFoldMapM tag
gFoldMapNonSum = [Char] -> (:+:) l r p -> GenericFoldMapM tag
forall a. HasCallStack => [Char] -> a
error [Char]
eNoSum
instance GFoldMapNonSum tag V1        where gFoldMapNonSum :: forall (p :: k). V1 p -> GenericFoldMapM tag
gFoldMapNonSum = [Char] -> V1 p -> GenericFoldMapM tag
forall a. HasCallStack => [Char] -> a
error [Char]
eNoEmpty