{-# 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 GHC.TypeLits ( Symbol )
import Generic.Data.Function.Traverse.Constructor
import Generic.Data.Function.Common.Error

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

instance (Functor (GenericTraverseF tag), GTraverseNonSumD tag dtName gf)
  => GTraverseNonSum tag (D1 (MetaData dtName _md2 _md3 _md4) gf) where
    gTraverseNonSum :: forall (p :: k).
GenericTraverseF tag (D1 ('MetaData dtName _md2 _md3 _md4) gf p)
gTraverseNonSum = gf p -> M1 D ('MetaData dtName _md2 _md3 _md4) gf p
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (gf p -> M1 D ('MetaData dtName _md2 _md3 _md4) gf p)
-> GenericTraverseF tag (gf p)
-> GenericTraverseF
     tag (M1 D ('MetaData dtName _md2 _md3 _md4) gf p)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (tag :: k) (cd :: Symbol) (gf :: k -> Type) (p :: k).
GTraverseNonSumD tag cd gf =>
GenericTraverseF tag (gf p)
forall {k} {k} (tag :: k) (cd :: Symbol) (gf :: k -> Type)
       (p :: k).
GTraverseNonSumD tag cd gf =>
GenericTraverseF tag (gf p)
gTraverseNonSumD @tag @dtName

class GTraverseNonSumD tag (cd :: Symbol) gf where
    gTraverseNonSumD :: GenericTraverseF tag (gf p)

instance (Functor (GenericTraverseF tag), GTraverseC tag cd cstrName 0 gf)
  => GTraverseNonSumD tag cd (C1 (MetaCons cstrName _mc2 _mc3) gf) where
    gTraverseNonSumD :: forall (p :: k).
GenericTraverseF tag (C1 ('MetaCons cstrName _mc2 _mc3) gf p)
gTraverseNonSumD = gf p -> M1 C ('MetaCons cstrName _mc2 _mc3) gf p
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (gf p -> M1 C ('MetaCons cstrName _mc2 _mc3) gf p)
-> GenericTraverseF tag (gf p)
-> GenericTraverseF tag (M1 C ('MetaCons cstrName _mc2 _mc3) gf p)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (tag :: k) (cd :: Symbol) (cc :: Symbol) (si :: Natural)
       (gf :: k -> Type) (p :: k).
GTraverseC tag cd cc si gf =>
GenericTraverseF tag (gf p)
forall {k} {k1} (tag :: k) (cd :: Symbol) (cc :: Symbol)
       (si :: Natural) (gf :: k1 -> Type) (p :: k1).
GTraverseC tag cd cc si gf =>
GenericTraverseF tag (gf p)
gTraverseC @tag @cd @cstrName @0

instance GTraverseNonSumD tag cd (l :+: r) where gTraverseNonSumD :: forall (p :: k). GenericTraverseF tag ((:+:) l r p)
gTraverseNonSumD = [Char] -> GenericTraverseF tag ((:+:) l r p)
forall a. HasCallStack => [Char] -> a
error [Char]
eNoSum
instance GenericTraverse tag => GTraverseNonSumD tag cd V1 where
    gTraverseNonSumD :: forall (p :: k). GenericTraverseF tag (V1 p)
gTraverseNonSumD = forall (tag :: k) {k1} (p :: k1).
GenericTraverse tag =>
GenericTraverseF tag (V1 p)
forall {k} (tag :: k) {k1} (p :: k1).
GenericTraverse tag =>
GenericTraverseF tag (V1 p)
genericTraverseV1 @tag