{-# 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 ( TypeError )
import Generic.Data.Function.Error ( type ENoEmpty, type EUnexpectedSum )
import Generic.Data.Function.Traverse.Constructor ( GTraverseC(gTraverseC) )

class GTraverseNonSum f f' where gTraverseNonSum :: f (f' p)

instance (Functor f, GTraverseNonSum' cd f f') => GTraverseNonSum f (D1 cd f') where
    gTraverseNonSum :: forall (p :: k). f (D1 cd f' p)
gTraverseNonSum = forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> forall {k} {k} {k} (cd :: k) (f :: k -> Type) (f' :: k -> k)
       (p :: k).
GTraverseNonSum' cd f f' =>
f (f' p)
gTraverseNonSum' @cd

class GTraverseNonSum' cd f f' where gTraverseNonSum' :: f (f' p)

instance TypeError EUnexpectedSum => GTraverseNonSum' cd f (l :+: r) where
    gTraverseNonSum' :: forall (p :: k). f ((:+:) l r p)
gTraverseNonSum' = forall a. HasCallStack => a
undefined

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

instance TypeError ENoEmpty => GTraverseNonSum' cd f V1 where
    gTraverseNonSum' :: forall (p :: k). f (V1 p)
gTraverseNonSum' = forall a. HasCallStack => a
undefined