{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}

-- | Compose two 'HyperType's.
--
-- Inspired by [hyperfunctions' @Category@ instance](http://hackage.haskell.org/package/hyperfunctions-0/docs/Control-Monad-Hyper.html).
module Hyper.Combinator.Compose
    ( HCompose (..)
    , _HCompose
    , W_HCompose (..)
    , HComposeConstraint1
    , decompose
    , decompose'
    , hcomposed
    ) where

import Control.Lens (Iso', Optic, Profunctor, iso)
import Data.Constraint (withDict)
import Hyper.Class.Apply (HApply (..))
import Hyper.Class.Foldable (HFoldable (..))
import Hyper.Class.Functor (HFunctor (..), hiso)
import Hyper.Class.Nodes (HNodes (..), HWitness (..), (#>))
import Hyper.Class.Pointed (HPointed (..))
import Hyper.Class.Recursive (RNodes (..), RTraversable, Recursively (..))
import Hyper.Class.Traversable (ContainedH (..), HTraversable (..), htraverse)
import Hyper.Class.ZipMatch (ZipMatch (..))
import Hyper.Type (GetHyperType, HyperType, type (#))
import Hyper.Type.Pure (Pure, _Pure)
import Text.PrettyPrint.HughesPJClass (Pretty (..))

import Hyper.Internal.Prelude

-- | Compose two 'HyperType's as an external and internal layer
newtype HCompose a b h = HCompose {forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType).
HCompose a b h -> a # HCompose b (GetHyperType h)
getHCompose :: a # HCompose b (GetHyperType h)}
    deriving stock (forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType) x.
Rep (HCompose a b h) x -> HCompose a b h
forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType) x.
HCompose a b h -> Rep (HCompose a b h) x
$cto :: forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType) x.
Rep (HCompose a b h) x -> HCompose a b h
$cfrom :: forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType) x.
HCompose a b h -> Rep (HCompose a b h) x
Generic)

makeCommonInstances [''HCompose]

instance Pretty (a # HCompose b (GetHyperType h)) => Pretty (HCompose a b h) where
    pPrintPrec :: PrettyLevel -> Rational -> HCompose a b h -> Doc
pPrintPrec PrettyLevel
level Rational
prec (HCompose a # HCompose b (GetHyperType h)
x) = forall a. Pretty a => PrettyLevel -> Rational -> a -> Doc
pPrintPrec PrettyLevel
level Rational
prec a # HCompose b (GetHyperType h)
x

-- | An 'Control.Lens.Iso' for the 'HCompose' @newtype@
{-# INLINE _HCompose #-}
_HCompose ::
    Iso
        (HCompose a0 b0 # h0)
        (HCompose a1 b1 # h1)
        (a0 # HCompose b0 h0)
        (a1 # HCompose b1 h1)
_HCompose :: forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose = forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType).
HCompose a b h -> a # HCompose b (GetHyperType h)
getHCompose forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType).
(a # HCompose b (GetHyperType h)) -> HCompose a b h
HCompose

{-# ANN module "HLint: ignore Use camelCase" #-}
data W_HCompose a b n where
    W_HCompose :: HWitness a a0 -> HWitness b b0 -> W_HCompose a b (HCompose a0 b0)

instance (HNodes a, HNodes b) => HNodes (HCompose a b) where
    type HNodesConstraint (HCompose a b) c = HNodesConstraint a (HComposeConstraint0 c b)
    type HWitnessType (HCompose a b) = W_HCompose a b
    {-# INLINE hLiftConstraint #-}
    hLiftConstraint :: forall (c :: (AHyperType -> *) -> Constraint)
       (n :: AHyperType -> *) r.
HNodesConstraint (HCompose a b) c =>
HWitness (HCompose a b) n -> Proxy c -> (c n => r) -> r
hLiftConstraint (HWitness (W_HCompose HWitness a a0
w0 HWitness b b0
w1)) Proxy c
p c n => r
r =
        forall (h :: AHyperType -> *)
       (c :: (AHyperType -> *) -> Constraint) (n :: AHyperType -> *) r.
(HNodes h, HNodesConstraint h c) =>
HWitness h n -> Proxy c -> (c n => r) -> r
hLiftConstraint HWitness a a0
w0 (forall (c :: (AHyperType -> *) -> Constraint).
Proxy c -> Proxy (HComposeConstraint0 c b)
p0 Proxy c
p) forall a b. (a -> b) -> a -> b
$
            forall (h :: AHyperType -> *)
       (c :: (AHyperType -> *) -> Constraint) (n :: AHyperType -> *) r.
(HNodes h, HNodesConstraint h c) =>
HWitness h n -> Proxy c -> (c n => r) -> r
hLiftConstraint HWitness b b0
w1 (forall (proxy0 :: ((AHyperType -> *) -> Constraint) -> *)
       (c :: (AHyperType -> *) -> Constraint)
       (proxy1 :: (AHyperType -> *) -> *) (a0 :: AHyperType -> *).
proxy0 c -> proxy1 a0 -> Proxy (HComposeConstraint1 c a0)
p1 Proxy c
p HWitness a a0
w0) (forall (c :: Constraint) e r. HasDict c e => e -> (c => r) -> r
withDict (forall (c :: (AHyperType -> *) -> Constraint)
       (a0 :: AHyperType -> *) (b0 :: AHyperType -> *).
HComposeConstraint1 c a0 b0 =>
Proxy c
-> HWitness a a0 -> HWitness b b0 -> Dict (c (HCompose a0 b0))
d0 Proxy c
p HWitness a a0
w0 HWitness b b0
w1) c n => r
r)
                forall (c :: Constraint) e r. HasDict c e => (c => r) -> e -> r
\\ forall (c :: (AHyperType -> *) -> Constraint)
       (b :: AHyperType -> *) (h0 :: AHyperType -> *)
       (proxy0 :: ((AHyperType -> *) -> Constraint) -> *)
       (proxy1 :: (AHyperType -> *) -> *)
       (proxy2 :: (AHyperType -> *) -> *).
HComposeConstraint0 c b h0 =>
proxy0 c
-> proxy1 b
-> proxy2 h0
-> Dict (HNodesConstraint b (HComposeConstraint1 c h0))
hComposeConstraint0 Proxy c
p (forall {k} (t :: k). Proxy t
Proxy @b) HWitness a a0
w0
        where
            p0 :: Proxy c -> Proxy (HComposeConstraint0 c b)
            p0 :: forall (c :: (AHyperType -> *) -> Constraint).
Proxy c -> Proxy (HComposeConstraint0 c b)
p0 Proxy c
_ = forall {k} (t :: k). Proxy t
Proxy
            p1 :: proxy0 c -> proxy1 a0 -> Proxy (HComposeConstraint1 c a0)
            p1 :: forall (proxy0 :: ((AHyperType -> *) -> Constraint) -> *)
       (c :: (AHyperType -> *) -> Constraint)
       (proxy1 :: (AHyperType -> *) -> *) (a0 :: AHyperType -> *).
proxy0 c -> proxy1 a0 -> Proxy (HComposeConstraint1 c a0)
p1 proxy0 c
_ proxy1 a0
_ = forall {k} (t :: k). Proxy t
Proxy
            d0 ::
                HComposeConstraint1 c a0 b0 =>
                Proxy c ->
                HWitness a a0 ->
                HWitness b b0 ->
                Dict (c (HCompose a0 b0))
            d0 :: forall (c :: (AHyperType -> *) -> Constraint)
       (a0 :: AHyperType -> *) (b0 :: AHyperType -> *).
HComposeConstraint1 c a0 b0 =>
Proxy c
-> HWitness a a0 -> HWitness b b0 -> Dict (c (HCompose a0 b0))
d0 Proxy c
_ HWitness a a0
_ HWitness b b0
_ = forall (c :: (AHyperType -> *) -> Constraint)
       (h0 :: AHyperType -> *) (h1 :: AHyperType -> *).
HComposeConstraint1 c h0 h1 =>
Dict (c (HCompose h0 h1))
hComposeConstraint1

class HComposeConstraint0 (c :: HyperType -> Constraint) (b :: HyperType) (h0 :: HyperType) where
    hComposeConstraint0 ::
        proxy0 c ->
        proxy1 b ->
        proxy2 h0 ->
        Dict (HNodesConstraint b (HComposeConstraint1 c h0))

instance HNodesConstraint b (HComposeConstraint1 c h0) => HComposeConstraint0 c b h0 where
    {-# INLINE hComposeConstraint0 #-}
    hComposeConstraint0 :: forall (proxy0 :: ((AHyperType -> *) -> Constraint) -> *)
       (proxy1 :: (AHyperType -> *) -> *)
       (proxy2 :: (AHyperType -> *) -> *).
proxy0 c
-> proxy1 b
-> proxy2 h0
-> Dict (HNodesConstraint b (HComposeConstraint1 c h0))
hComposeConstraint0 proxy0 c
_ proxy1 b
_ proxy2 h0
_ = forall (a :: Constraint). a => Dict a
Dict

class HComposeConstraint1 (c :: HyperType -> Constraint) (h0 :: HyperType) (h1 :: HyperType) where
    hComposeConstraint1 :: Dict (c (HCompose h0 h1))

instance c (HCompose h0 h1) => HComposeConstraint1 c h0 h1 where
    {-# INLINE hComposeConstraint1 #-}
    hComposeConstraint1 :: Dict (c (HCompose h0 h1))
hComposeConstraint1 = forall (a :: Constraint). a => Dict a
Dict

instance
    (HPointed a, HPointed b) =>
    HPointed (HCompose a b)
    where
    {-# INLINE hpure #-}
    hpure :: forall (p :: AHyperType -> *).
(forall (n :: AHyperType -> *). HWitness (HCompose a b) n -> p # n)
-> HCompose a b # p
hpure forall (n :: AHyperType -> *). HWitness (HCompose a b) n -> p # n
x =
        forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
            # hpure
                ( \wa ->
                    _HCompose # hpure (\wb -> _HCompose # x (HWitness (W_HCompose wa wb)))
                )

instance (HFunctor a, HFunctor b) => HFunctor (HCompose a b) where
    {-# INLINE hmap #-}
    hmap :: forall (p :: AHyperType -> *) (q :: AHyperType -> *).
(forall (n :: AHyperType -> *).
 HWitness (HCompose a b) n -> (p # n) -> q # n)
-> (HCompose a b # p) -> HCompose a b # q
hmap forall (n :: AHyperType -> *).
HWitness (HCompose a b) n -> (p # n) -> q # n
f =
        forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
            forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> q # n)
-> (h # p) -> h # q
hmap
                ( \HWitness a n
w0 ->
                    forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> q # n)
-> (h # p) -> h # q
hmap (\HWitness b n
w1 -> forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (n :: AHyperType -> *).
HWitness (HCompose a b) n -> (p # n) -> q # n
f (forall (h :: AHyperType -> *) (n :: AHyperType -> *).
HWitnessType h n -> HWitness h n
HWitness (forall (a :: AHyperType -> *) (a0 :: AHyperType -> *)
       (b :: AHyperType -> *) (b0 :: AHyperType -> *).
HWitness a a0 -> HWitness b b0 -> W_HCompose a b (HCompose a0 b0)
W_HCompose HWitness a n
w0 HWitness b n
w1)))
                )

instance (HApply a, HApply b) => HApply (HCompose a b) where
    {-# INLINE hzip #-}
    hzip :: forall (p :: AHyperType -> *) (q :: AHyperType -> *).
(HCompose a b # p)
-> (HCompose a b # q) -> HCompose a b # (p :*: q)
hzip (HCompose a # HCompose b (GetHyperType ('AHyperType p))
a0) =
        forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
            forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> q # n)
-> (h # p) -> h # q
hmap
                ( \HWitness a n
_ (HCompose b # HCompose p (GetHyperType ('AHyperType n))
b0 :*: HCompose b # HCompose q (GetHyperType ('AHyperType n))
b1) ->
                    forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
                        # hmap
                            ( \_ (HCompose i0 :*: HCompose i1) ->
                                _HCompose # (i0 :*: i1)
                            )
                            (hzip b0 b1)
                )
            forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HApply h =>
(h # p) -> (h # q) -> h # (p :*: q)
hzip a # HCompose b (GetHyperType ('AHyperType p))
a0

instance (HFoldable a, HFoldable b) => HFoldable (HCompose a b) where
    {-# INLINE hfoldMap #-}
    hfoldMap :: forall a (p :: AHyperType -> *).
Monoid a =>
(forall (n :: AHyperType -> *).
 HWitness (HCompose a b) n -> (p # n) -> a)
-> (HCompose a b # p) -> a
hfoldMap forall (n :: AHyperType -> *).
HWitness (HCompose a b) n -> (p # n) -> a
f =
        forall (h :: AHyperType -> *) a (p :: AHyperType -> *).
(HFoldable h, Monoid a) =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> a)
-> (h # p) -> a
hfoldMap
            ( \HWitness a n
w0 ->
                forall (h :: AHyperType -> *) a (p :: AHyperType -> *).
(HFoldable h, Monoid a) =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> a)
-> (h # p) -> a
hfoldMap (\HWitness b n
w1 -> forall (n :: AHyperType -> *).
HWitness (HCompose a b) n -> (p # n) -> a
f (forall (h :: AHyperType -> *) (n :: AHyperType -> *).
HWitnessType h n -> HWitness h n
HWitness (forall (a :: AHyperType -> *) (a0 :: AHyperType -> *)
       (b :: AHyperType -> *) (b0 :: AHyperType -> *).
HWitness a a0 -> HWitness b b0 -> W_HCompose a b (HCompose a0 b0)
W_HCompose HWitness a n
w0 HWitness b n
w1)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose)
            )
            forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose)

instance (HTraversable a, HTraversable b) => HTraversable (HCompose a b) where
    {-# INLINE hsequence #-}
    hsequence :: forall (f :: * -> *) (p :: AHyperType -> *).
Applicative f =>
(HCompose a b # ContainedH f p) -> f (HCompose a b # p)
hsequence =
        forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
            ( forall (h :: AHyperType -> *) (f :: * -> *) (p :: AHyperType -> *).
(HTraversable h, Applicative f) =>
(h # ContainedH f p) -> f (h # p)
hsequence
                forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> q # n)
-> (h # p) -> h # q
hmap (forall a b. a -> b -> a
const (forall (f :: * -> *) (p :: AHyperType -> *) (h :: AHyperType).
f (p h) -> ContainedH f p h
MkContainedH forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose (forall (f :: * -> *) (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
(Applicative f, HTraversable h) =>
(forall (n :: AHyperType -> *).
 HWitness h n -> (p # n) -> f (q # n))
-> (h # p) -> f (h # q)
htraverse (forall a b. a -> b -> a
const (forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall (f :: * -> *) (p :: AHyperType -> *) (h :: AHyperType).
ContainedH f p h -> f (p h)
runContainedH)))))
            )

instance
    (ZipMatch h0, ZipMatch h1, HTraversable h0, HFunctor h1) =>
    ZipMatch (HCompose h0 h1)
    where
    {-# INLINE zipMatch #-}
    zipMatch :: forall (p :: AHyperType -> *) (q :: AHyperType -> *).
(HCompose h0 h1 # p)
-> (HCompose h0 h1 # q) -> Maybe (HCompose h0 h1 # (p :*: q))
zipMatch (HCompose h0 # HCompose h1 (GetHyperType ('AHyperType p))
x) (HCompose h0 # HCompose h1 (GetHyperType ('AHyperType q))
y) =
        forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
ZipMatch h =>
(h # p) -> (h # q) -> Maybe (h # (p :*: q))
zipMatch h0 # HCompose h1 (GetHyperType ('AHyperType p))
x h0 # HCompose h1 (GetHyperType ('AHyperType q))
y
            forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (f :: * -> *) (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
(Applicative f, HTraversable h) =>
(forall (n :: AHyperType -> *).
 HWitness h n -> (p # n) -> f (q # n))
-> (h # p) -> f (h # q)
htraverse
                ( \HWitness h0 n
_ (HCompose h1 # HCompose p (GetHyperType ('AHyperType n))
cx :*: HCompose h1 # HCompose q (GetHyperType ('AHyperType n))
cy) ->
                    forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
ZipMatch h =>
(h # p) -> (h # q) -> Maybe (h # (p :*: q))
zipMatch h1 # HCompose p (GetHyperType ('AHyperType n))
cx h1 # HCompose q (GetHyperType ('AHyperType n))
cy
                        forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall t b. AReview t b -> b -> t
#) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *). HWitness h n -> (p # n) -> q # n)
-> (h # p) -> h # q
hmap (\HWitness h1 n
_ (HCompose p # HCompose n (GetHyperType ('AHyperType n))
bx :*: HCompose q # HCompose n (GetHyperType ('AHyperType n))
by) -> p # HCompose n (GetHyperType ('AHyperType n))
bx forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: q # HCompose n (GetHyperType ('AHyperType n))
by forall a b. a -> (a -> b) -> b
& forall (a :: AHyperType -> *) (b :: AHyperType -> *)
       (h :: AHyperType).
(a # HCompose b (GetHyperType h)) -> HCompose a b h
HCompose)
                )
            forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> (forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall t b. AReview t b -> b -> t
#)

instance
    ( HNodes a
    , HNodes b
    , HNodesConstraint a (HComposeConstraint0 RNodes b)
    ) =>
    RNodes (HCompose a b)

instance
    ( HNodes h0
    , HNodes h1
    , c (HCompose h0 h1)
    , HNodesConstraint h0 (HComposeConstraint0 RNodes h1)
    , HNodesConstraint h0 (HComposeConstraint0 (Recursively c) h1)
    ) =>
    Recursively c (HCompose h0 h1)

instance
    ( HTraversable a
    , HTraversable b
    , HNodesConstraint a (HComposeConstraint0 RNodes b)
    , HNodesConstraint a (HComposeConstraint0 (Recursively HFunctor) b)
    , HNodesConstraint a (HComposeConstraint0 (Recursively HFoldable) b)
    , HNodesConstraint a (HComposeConstraint0 RTraversable b)
    ) =>
    RTraversable (HCompose a b)

hcomposed ::
    (Profunctor p, Functor f) =>
    Optic
        p
        f
        (a0 # HCompose b0 c0)
        (a1 # HCompose b1 c1)
        (HCompose a2 b2 # c2)
        (HCompose a3 b3 # c3) ->
    Optic
        p
        f
        (HCompose a0 b0 # c0)
        (HCompose a1 b1 # c1)
        (a2 # HCompose b2 c2)
        (a3 # HCompose b3 c3)
hcomposed :: forall (p :: * -> * -> *) (f :: * -> *) (a0 :: AHyperType -> *)
       (b0 :: AHyperType -> *) (c0 :: AHyperType -> *)
       (a1 :: AHyperType -> *) (b1 :: AHyperType -> *)
       (c1 :: AHyperType -> *) (a2 :: AHyperType -> *)
       (b2 :: AHyperType -> *) (c2 :: AHyperType -> *)
       (a3 :: AHyperType -> *) (b3 :: AHyperType -> *)
       (c3 :: AHyperType -> *).
(Profunctor p, Functor f) =>
Optic
  p
  f
  (a0 # HCompose b0 c0)
  (a1 # HCompose b1 c1)
  (HCompose a2 b2 # c2)
  (HCompose a3 b3 # c3)
-> Optic
     p
     f
     (HCompose a0 b0 # c0)
     (HCompose a1 b1 # c1)
     (a2 # HCompose b2 c2)
     (a3 # HCompose b3 c3)
hcomposed Optic
  p
  f
  (a0 # HCompose b0 c0)
  (a1 # HCompose b1 c1)
  (HCompose a2 b2 # c2)
  (HCompose a3 b3 # c3)
f = forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall b c a. (b -> c) -> (a -> b) -> a -> c
. Optic
  p
  f
  (a0 # HCompose b0 c0)
  (a1 # HCompose b1 c1)
  (HCompose a2 b2 # c2)
  (HCompose a3 b3 # c3)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose

-- | Inject Pure between two hypertypes.
decompose ::
    forall a0 b0 a1 b1.
    (Recursively HFunctor a0, Recursively HFunctor b0, Recursively HFunctor a1, Recursively HFunctor b1) =>
    Iso (Pure # HCompose a0 b0) (Pure # HCompose a1 b1) (a0 # b0) (a1 # b1)
decompose :: forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (a1 :: AHyperType -> *) (b1 :: AHyperType -> *).
(Recursively HFunctor a0, Recursively HFunctor b0,
 Recursively HFunctor a1, Recursively HFunctor b1) =>
Iso
  (Pure # HCompose a0 b0) (Pure # HCompose a1 b1) (a0 # b0) (a1 # b1)
decompose = forall s a b t. (s -> a) -> (b -> t) -> Iso s t a b
iso (forall s a. s -> Getting a s a -> a
^. forall (a :: AHyperType -> *) (b :: AHyperType -> *).
(Recursively HFunctor a, Recursively HFunctor b) =>
Iso' (Pure # HCompose a b) (a # b)
decompose') (forall (a :: AHyperType -> *) (b :: AHyperType -> *).
(Recursively HFunctor a, Recursively HFunctor b) =>
Iso' (Pure # HCompose a b) (a # b)
decompose' forall t b. AReview t b -> b -> t
#)

decompose' ::
    forall a b.
    (Recursively HFunctor a, Recursively HFunctor b) =>
    Iso' (Pure # HCompose a b) (a # b)
decompose' :: forall (a :: AHyperType -> *) (b :: AHyperType -> *).
(Recursively HFunctor a, Recursively HFunctor b) =>
Iso' (Pure # HCompose a b) (a # b)
decompose' =
    forall (h :: AHyperType -> *) (j :: AHyperType -> *).
Iso (Pure # h) (Pure # j) (h # Pure) (j # Pure)
_Pure
        forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
        forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *).
 HWitness h n -> AnIso' (p # n) (q # n))
-> Iso' (h # p) (h # q)
hiso
            ( forall {k} (t :: k). Proxy t
Proxy @(Recursively HFunctor) forall (h :: AHyperType -> *)
       (c :: (AHyperType -> *) -> Constraint) (n :: AHyperType -> *) r.
(HNodes h, HNodesConstraint h c) =>
Proxy c -> (c n => r) -> HWitness h n -> r
#>
                forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose
                    forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (h :: AHyperType -> *) (p :: AHyperType -> *)
       (q :: AHyperType -> *).
HFunctor h =>
(forall (n :: AHyperType -> *).
 HWitness h n -> AnIso' (p # n) (q # n))
-> Iso' (h # p) (h # q)
hiso (forall {k} (t :: k). Proxy t
Proxy @(Recursively HFunctor) forall (h :: AHyperType -> *)
       (c :: (AHyperType -> *) -> Constraint) (n :: AHyperType -> *) r.
(HNodes h, HNodesConstraint h c) =>
Proxy c -> (c n => r) -> HWitness h n -> r
#> forall (a0 :: AHyperType -> *) (b0 :: AHyperType -> *)
       (h0 :: AHyperType -> *) (a1 :: AHyperType -> *)
       (b1 :: AHyperType -> *) (h1 :: AHyperType -> *).
Iso
  (HCompose a0 b0 # h0)
  (HCompose a1 b1 # h1)
  (a0 # HCompose b0 h0)
  (a1 # HCompose b1 h1)
_HCompose forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: AHyperType -> *) (b :: AHyperType -> *).
(Recursively HFunctor a, Recursively HFunctor b) =>
Iso' (Pure # HCompose a b) (a # b)
decompose')
                    forall (c :: Constraint) e r. HasDict c e => (c => r) -> e -> r
\\ forall (c :: (AHyperType -> *) -> Constraint)
       (h :: AHyperType -> *) (proxy :: Constraint -> *).
Recursively c h =>
proxy (c h) -> Dict (c h, HNodesConstraint h (Recursively c))
recursively (forall {k} (t :: k). Proxy t
Proxy @(HFunctor b))
            )
        forall (c :: Constraint) e r. HasDict c e => (c => r) -> e -> r
\\ forall (c :: (AHyperType -> *) -> Constraint)
       (h :: AHyperType -> *) (proxy :: Constraint -> *).
Recursively c h =>
proxy (c h) -> Dict (c h, HNodesConstraint h (Recursively c))
recursively (forall {k} (t :: k). Proxy t
Proxy @(HFunctor a))