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

module Generic.Data.Function.Traverse.NonSum where

import GHC.Generics
import Generic.Data.Function.Traverse.Constructor
  ( GTraverseC(gTraverseC)
  , GenericTraverse(type GenericTraverseF)
  )
import Generic.Data.Rep.Error

class GTraverseNonSum (cd :: Meta) tag gf where
    gTraverseNonSum :: GenericTraverseF tag (gf p)

instance (Functor (GenericTraverseF tag), GTraverseC cd cc 0 tag gf)
  => GTraverseNonSum cd tag (C1 cc gf) where
    gTraverseNonSum :: forall (p :: k). GenericTraverseF tag (C1 cc gf p)
gTraverseNonSum = gf p -> M1 C cc gf p
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (gf p -> M1 C cc gf p)
-> GenericTraverseF tag (gf p)
-> GenericTraverseF tag (M1 C cc gf p)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> forall {k} {k1} {k2} {k3} (cd :: k) (cc :: k1) (si :: Natural)
       (tag :: k2) (gf :: k3 -> Type) (p :: k3).
GTraverseC cd cc si tag gf =>
GenericTraverseF tag (gf p)
forall (cd :: Meta) (cc :: Meta) (si :: Natural) (tag :: k)
       (gf :: k -> Type) (p :: k).
GTraverseC cd cc si tag gf =>
GenericTraverseF tag (gf p)
gTraverseC @cd @cc @0 @tag

instance GTraverseNonSum cd tag (l :+: r) where gTraverseNonSum :: forall (p :: k). GenericTraverseF tag ((:+:) l r p)
gTraverseNonSum = [Char] -> GenericTraverseF tag ((:+:) l r p)
forall a. HasCallStack => [Char] -> a
error [Char]
eNoSum
instance GTraverseNonSum cd tag V1        where gTraverseNonSum :: forall (p :: k). GenericTraverseF tag (V1 p)
gTraverseNonSum = [Char] -> GenericTraverseF tag (V1 p)
forall a. HasCallStack => [Char] -> a
error [Char]
eNoEmpty