{-# LANGUAGE CPP                   #-}
{-# LANGUAGE ConstraintKinds       #-}
{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE DefaultSignatures     #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds             #-}
{-# LANGUAGE Safe                  #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeOperators         #-}
{-# LANGUAGE UndecidableInstances  #-}
module Data.Vec.DataFamily.SpineStrict.Pigeonhole (
    Pigeonhole (..),
    
    gindex,
    gtabulate,
    gix,
    
    gtraverse,
    gitraverse,
    
    gfrom, GFrom,
    gto, GTo,
    GPigeonholeSize,
    ) where
import Prelude (Functor (..), fst, uncurry, ($), (.))
import Control.Applicative             (Applicative (..), (<$>))
import Control.Arrow                   (first)
import Data.Fin                        (Fin (..))
import Data.Functor.Confusing          (confusing, fusing, iconfusing)
import Data.Functor.Identity           (Identity (..))
import Data.Functor.Product            (Product (..))
import Data.Nat                        (Nat (..))
import Data.Proxy                      (Proxy (..))
import Data.Vec.DataFamily.SpineStrict (Vec (..), tabulate)
import GHC.Generics                    (M1 (..), Par1 (..), U1 (..), (:*:) (..))
import qualified Control.Lens.Yocto              as YLens
import qualified Data.Fin                        as F
import qualified Data.Fin.Enum                   as F
import qualified Data.Type.Nat                   as N
import qualified Data.Vec.DataFamily.SpineStrict as V
import qualified GHC.Generics                    as G
#ifdef MIN_VERSION_transformers_compat
import Control.Monad.Trans.Instances ()
#endif
class Pigeonhole f where
    
    type PigeonholeSize f :: Nat
    type PigeonholeSize f = GPigeonholeSize f
    
    from :: f x -> Vec (PigeonholeSize f) x
    default from :: (G.Generic1 f, GFrom f, PigeonholeSize f ~ GPigeonholeSize f) => f x -> Vec (PigeonholeSize f) x
    from = f x -> Vec (PigeonholeSize f) x
forall (c :: * -> *) a.
(Generic1 @* c, GFrom c) =>
c a -> Vec (GPigeonholeSize c) a
gfrom
    
    to :: Vec (PigeonholeSize f) x -> f x
    default to :: (G.Generic1 f, GTo f, PigeonholeSize f ~ GPigeonholeSize f) => Vec (PigeonholeSize f) x -> f x
    to = Vec (PigeonholeSize f) x -> f x
forall (c :: * -> *) a.
(Generic1 @* c, GTo c) =>
Vec (GPigeonholeSize c) a -> c a
gto
instance Pigeonhole Identity
instance Pigeonhole Proxy where
    type PigeonholeSize Proxy = 'Z
    from :: Proxy @* x -> Vec (PigeonholeSize (Proxy @*)) x
from Proxy @* x
_ = Vec (PigeonholeSize (Proxy @*)) x
forall a. Vec 'Z a
VNil
    to :: Vec (PigeonholeSize (Proxy @*)) x -> Proxy @* x
to Vec (PigeonholeSize (Proxy @*)) x
_   = Proxy @* x
forall k (t :: k). Proxy @k t
Proxy
instance (Pigeonhole f, Pigeonhole g, N.SNatI (PigeonholeSize f)) => Pigeonhole (Product f g) where
    type PigeonholeSize (Product f g) = N.Plus (PigeonholeSize f) (PigeonholeSize g)
    to :: Vec (PigeonholeSize (Product @* f g)) x -> Product @* f g x
to = (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
-> Product @* f g x
forall (f :: * -> *) (g :: * -> *) a.
(Pigeonhole f, Pigeonhole g) =>
(Vec (PigeonholeSize f) a, Vec (PigeonholeSize g) a)
-> Product @* f g a
f ((Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
 -> Product @* f g x)
-> (Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
    -> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x))
-> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
-> Product @* f g x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
-> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
forall (n :: Nat) (m :: Nat) a.
SNatI n =>
Vec (Plus n m) a -> (Vec n a, Vec m a)
V.split where f :: (Vec (PigeonholeSize f) a, Vec (PigeonholeSize g) a)
-> Product @* f g a
f (Vec (PigeonholeSize f) a
a, Vec (PigeonholeSize g) a
b) = f a -> g a -> Product @* f g a
forall k (f :: k -> *) (g :: k -> *) (a :: k).
f a -> g a -> Product @k f g a
Pair (Vec (PigeonholeSize f) a -> f a
forall (f :: * -> *) x.
Pigeonhole f =>
Vec (PigeonholeSize f) x -> f x
to Vec (PigeonholeSize f) a
a) (Vec (PigeonholeSize g) a -> g a
forall (f :: * -> *) x.
Pigeonhole f =>
Vec (PigeonholeSize f) x -> f x
to Vec (PigeonholeSize g) a
b)
    from :: Product @* f g x -> Vec (PigeonholeSize (Product @* f g)) x
from = (Vec (PigeonholeSize f) x
 -> Vec (PigeonholeSize g) x
 -> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x)
-> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
-> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Vec (PigeonholeSize f) x
-> Vec (PigeonholeSize g) x
-> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
forall (n :: Nat) (m :: Nat) a.
SNatI n =>
Vec n a -> Vec m a -> Vec (Plus n m) a
(V.++) ((Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
 -> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x)
-> (Product @* f g x
    -> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x))
-> Product @* f g x
-> Vec (Plus (PigeonholeSize f) (PigeonholeSize g)) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Product @* f g x
-> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize g) x)
forall (f :: * -> *) (f :: * -> *) x.
(Pigeonhole f, Pigeonhole f) =>
Product @* f f x
-> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize f) x)
g where g :: Product @* f f x
-> (Vec (PigeonholeSize f) x, Vec (PigeonholeSize f) x)
g (Pair f x
a f x
b) = (f x -> Vec (PigeonholeSize f) x
forall (f :: * -> *) x.
Pigeonhole f =>
f x -> Vec (PigeonholeSize f) x
from f x
a, f x -> Vec (PigeonholeSize f) x
forall (f :: * -> *) x.
Pigeonhole f =>
f x -> Vec (PigeonholeSize f) x
from f x
b)
gindex
    :: ( G.Generic i, F.GFrom i, G.Generic1 f, GFrom f
       , F.GEnumSize i ~ GPigeonholeSize f, N.SNatI (GPigeonholeSize f)
       )
     => f a -> i -> a
gindex :: f a -> i -> a
gindex f a
fa i
i = f a -> Vec (PigeonholeSizeRep (Rep1 @* f) 'Z) a
forall (c :: * -> *) a.
(Generic1 @* c, GFrom c) =>
c a -> Vec (GPigeonholeSize c) a
gfrom f a
fa Vec (PigeonholeSizeRep (Rep1 @* f) 'Z) a
-> Fin (PigeonholeSizeRep (Rep1 @* f) 'Z) -> a
forall (n :: Nat) a. SNatI n => Vec n a -> Fin n -> a
V.! i -> Fin (GEnumSize i)
forall a. (Generic a, GFrom a) => a -> Fin (GEnumSize a)
F.gfrom i
i
gtabulate
    :: ( G.Generic i, F.GTo i, G.Generic1 f, GTo f
       , F.GEnumSize i ~ GPigeonholeSize f, N.SNatI (GPigeonholeSize f)
       )
     => (i -> a) -> f a
gtabulate :: (i -> a) -> f a
gtabulate i -> a
idx = Vec (GPigeonholeSize f) a -> f a
forall (c :: * -> *) a.
(Generic1 @* c, GTo c) =>
Vec (GPigeonholeSize c) a -> c a
gto (Vec (GPigeonholeSize f) a -> f a)
-> Vec (GPigeonholeSize f) a -> f a
forall a b. (a -> b) -> a -> b
$ (Fin (GPigeonholeSize f) -> a) -> Vec (GPigeonholeSize f) a
forall (n :: Nat) a. SNatI n => (Fin n -> a) -> Vec n a
tabulate (i -> a
idx (i -> a)
-> (Fin (GPigeonholeSize f) -> i) -> Fin (GPigeonholeSize f) -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fin (GPigeonholeSize f) -> i
forall a. (Generic a, GTo a) => Fin (GEnumSize a) -> a
F.gto)
gix :: ( G.Generic i, F.GFrom i, G.Generic1 t, GTo t, GFrom t
       , F.GEnumSize i ~ GPigeonholeSize t, N.SNatI (GPigeonholeSize t)
       , Functor f
       )
    => i -> (a -> f a) -> t a -> f (t a)
gix :: i -> (a -> f a) -> t a -> f (t a)
gix i
i = LensLike (Yoneda f) (t a) (t a) a a -> (a -> f a) -> t a -> f (t a)
forall (f :: * -> *) s t a b.
Functor f =>
LensLike (Yoneda f) s t a b -> LensLike f s t a b
fusing (LensLike (Yoneda f) (t a) (t a) a a
 -> (a -> f a) -> t a -> f (t a))
-> LensLike (Yoneda f) (t a) (t a) a a
-> (a -> f a)
-> t a
-> f (t a)
forall a b. (a -> b) -> a -> b
$ \a -> Yoneda f a
ab t a
ta -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a -> t a
forall (c :: * -> *) a.
(Generic1 @* c, GTo c) =>
Vec (GPigeonholeSize c) a -> c a
gto (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a -> t a)
-> Yoneda f (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a)
-> Yoneda f (t a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Fin (PigeonholeSizeRep (Rep1 @* t) 'Z)
-> LensLike'
     (Yoneda f) (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a) a
forall (n :: Nat) (f :: * -> *) a.
(SNatI n, Functor f) =>
Fin n -> LensLike' f (Vec n a) a
ix (i -> Fin (GEnumSize i)
forall a. (Generic a, GFrom a) => a -> Fin (GEnumSize a)
F.gfrom i
i) a -> Yoneda f a
ab (t a -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a
forall (c :: * -> *) a.
(Generic1 @* c, GFrom c) =>
c a -> Vec (GPigeonholeSize c) a
gfrom t a
ta)
ix :: forall n f a. (N.SNatI n, Functor f) => Fin n -> YLens.LensLike' f (Vec n a) a
ix :: Fin n -> LensLike' f (Vec n a) a
ix = IxLens f n a -> Fin n -> LensLike' f (Vec n a) a
forall (f :: * -> *) (n :: Nat) a.
IxLens f n a -> Fin n -> LensLike' f (Vec n a) a
getIxLens (IxLens f n a -> Fin n -> LensLike' f (Vec n a) a)
-> IxLens f n a -> Fin n -> LensLike' f (Vec n a) a
forall a b. (a -> b) -> a -> b
$ IxLens f 'Z a
-> (forall (m :: Nat).
    SNatI m =>
    IxLens f m a -> IxLens f ('S m) a)
-> IxLens f n a
forall (n :: Nat) (f :: Nat -> * -> *) a.
SNatI n =>
f 'Z a
-> (forall (m :: Nat). SNatI m => f m a -> f ('S m) a) -> f n a
N.induction1 IxLens f 'Z a
start forall (m :: Nat). SNatI m => IxLens f m a -> IxLens f ('S m) a
forall (m :: Nat). IxLens f m a -> IxLens f ('S m) a
step where
    start :: IxLens f 'Z a
    start :: IxLens f 'Z a
start = (Fin 'Z -> LensLike' f (Vec 'Z a) a) -> IxLens f 'Z a
forall (f :: * -> *) (n :: Nat) a.
(Fin n -> LensLike' f (Vec n a) a) -> IxLens f n a
IxLens Fin 'Z -> LensLike' f (Vec 'Z a) a
forall b. Fin 'Z -> b
F.absurd
    step :: IxLens f m a -> IxLens f ('S m) a
    step :: IxLens f m a -> IxLens f ('S m) a
step (IxLens Fin m -> LensLike' f (Vec m a) a
l) = (Fin ('S m) -> LensLike' f (Vec ('S m) a) a) -> IxLens f ('S m) a
forall (f :: * -> *) (n :: Nat) a.
(Fin n -> LensLike' f (Vec n a) a) -> IxLens f n a
IxLens ((Fin ('S m) -> LensLike' f (Vec ('S m) a) a) -> IxLens f ('S m) a)
-> (Fin ('S m) -> LensLike' f (Vec ('S m) a) a)
-> IxLens f ('S m) a
forall a b. (a -> b) -> a -> b
$ \Fin ('S m)
i -> case Fin ('S m)
i of
        Fin ('S m)
FZ   -> LensLike' f (Vec ('S m) a) a
forall (n :: Nat) a. Lens' (Vec ('S n) a) a
_head
        FS Fin n1
j -> LensLike f (Vec ('S m) a) (Vec ('S m) a) (Vec m a) (Vec m a)
forall (n :: Nat) a. Lens' (Vec ('S n) a) (Vec n a)
_tail LensLike f (Vec ('S m) a) (Vec ('S m) a) (Vec m a) (Vec m a)
-> LensLike' f (Vec m a) a -> LensLike' f (Vec ('S m) a) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Fin m -> LensLike' f (Vec m a) a
l Fin m
Fin n1
j
newtype IxLens f n a = IxLens { IxLens f n a -> Fin n -> LensLike' f (Vec n a) a
getIxLens :: Fin n -> YLens.LensLike' f (Vec n a) a }
_head :: YLens.Lens' (Vec ('S n) a) a
_head :: LensLike f (Vec ('S n) a) (Vec ('S n) a) a a
_head a -> f a
f (x ::: xs) = (a -> Vec n a -> Vec ('S n) a
forall (n :: Nat) a. a -> Vec n a -> Vec ('S n) a
::: Vec n a
xs) (a -> Vec ('S n) a) -> f a -> f (Vec ('S n) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f a
f a
x
{-# INLINE _head #-}
_tail :: YLens.Lens' (Vec ('S n) a) (Vec n a)
_tail :: LensLike f (Vec ('S n) a) (Vec ('S n) a) (Vec n a) (Vec n a)
_tail Vec n a -> f (Vec n a)
f (x ::: xs) = (a
x a -> Vec n a -> Vec ('S n) a
forall (n :: Nat) a. a -> Vec n a -> Vec ('S n) a
:::) (Vec n a -> Vec ('S n) a) -> f (Vec n a) -> f (Vec ('S n) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vec n a -> f (Vec n a)
f Vec n a
xs
{-# INLINE _tail #-}
gtraverse
    :: ( G.Generic1 t, GFrom t, GTo t
       , N.SNatI (GPigeonholeSize t)
       , Applicative f
       )
    => (a -> f b) -> t a -> f (t b)
gtraverse :: (a -> f b) -> t a -> f (t b)
gtraverse = LensLike (Curried (Yoneda f)) (t a) (t b) a b
-> (a -> f b) -> t a -> f (t b)
forall (f :: * -> *) s t a b.
Applicative f =>
LensLike (Curried (Yoneda f)) s t a b -> LensLike f s t a b
confusing (LensLike (Curried (Yoneda f)) (t a) (t b) a b
 -> (a -> f b) -> t a -> f (t b))
-> LensLike (Curried (Yoneda f)) (t a) (t b) a b
-> (a -> f b)
-> t a
-> f (t b)
forall a b. (a -> b) -> a -> b
$ \a -> Curried (Yoneda f) b
afb t a
ta -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b -> t b
forall (c :: * -> *) a.
(Generic1 @* c, GTo c) =>
Vec (GPigeonholeSize c) a -> c a
gto (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b -> t b)
-> Curried (Yoneda f) (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b)
-> Curried (Yoneda f) (t b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> Curried (Yoneda f) b)
-> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a
-> Curried (Yoneda f) (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b)
forall (n :: Nat) (f :: * -> *) a b.
(Applicative f, SNatI n) =>
(a -> f b) -> Vec n a -> f (Vec n b)
V.traverse a -> Curried (Yoneda f) b
afb (t a -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a
forall (c :: * -> *) a.
(Generic1 @* c, GFrom c) =>
c a -> Vec (GPigeonholeSize c) a
gfrom t a
ta)
{-# INLINE gtraverse #-}
gitraverse
    :: ( G.Generic i, F.GTo i
       , G.Generic1 t, GFrom t, GTo t
       , F.GEnumSize i ~ GPigeonholeSize t, N.SNatI (GPigeonholeSize t)
       , Applicative f
       )
    => (i -> a -> f b) -> t a -> f (t b)
gitraverse :: (i -> a -> f b) -> t a -> f (t b)
gitraverse = IxLensLike (Curried (Yoneda f)) i (t a) (t b) a b
-> (i -> a -> f b) -> t a -> f (t b)
forall (f :: * -> *) i s t a b.
Applicative f =>
IxLensLike (Curried (Yoneda f)) i s t a b -> IxLensLike f i s t a b
iconfusing (IxLensLike (Curried (Yoneda f)) i (t a) (t b) a b
 -> (i -> a -> f b) -> t a -> f (t b))
-> IxLensLike (Curried (Yoneda f)) i (t a) (t b) a b
-> (i -> a -> f b)
-> t a
-> f (t b)
forall a b. (a -> b) -> a -> b
$ \i -> a -> Curried (Yoneda f) b
iafb t a
ta -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b -> t b
forall (c :: * -> *) a.
(Generic1 @* c, GTo c) =>
Vec (GPigeonholeSize c) a -> c a
gto (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b -> t b)
-> Curried (Yoneda f) (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b)
-> Curried (Yoneda f) (t b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Fin (PigeonholeSizeRep (Rep1 @* t) 'Z)
 -> a -> Curried (Yoneda f) b)
-> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a
-> Curried (Yoneda f) (Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) b)
forall (n :: Nat) (f :: * -> *) a b.
(Applicative f, SNatI n) =>
(Fin n -> a -> f b) -> Vec n a -> f (Vec n b)
V.itraverse (\Fin (PigeonholeSizeRep (Rep1 @* t) 'Z)
i a
a -> i -> a -> Curried (Yoneda f) b
iafb (Fin (GEnumSize i) -> i
forall a. (Generic a, GTo a) => Fin (GEnumSize a) -> a
F.gto Fin (GEnumSize i)
Fin (PigeonholeSizeRep (Rep1 @* t) 'Z)
i) a
a) (t a -> Vec (PigeonholeSizeRep (Rep1 @* t) 'Z) a
forall (c :: * -> *) a.
(Generic1 @* c, GFrom c) =>
c a -> Vec (GPigeonholeSize c) a
gfrom t a
ta)
{-# INLINE gitraverse #-}
type GPigeonholeSize c = PigeonholeSizeRep (G.Rep1 c) N.Nat0
type family PigeonholeSizeRep (c :: * -> *) (n :: Nat) :: Nat where
    PigeonholeSizeRep (a :*: b )   n = PigeonholeSizeRep a (PigeonholeSizeRep b n)
    PigeonholeSizeRep (M1 _d _c a) n = PigeonholeSizeRep a n
    PigeonholeSizeRep Par1         n = 'N.S n
    PigeonholeSizeRep U1           n = n
gfrom :: (G.Generic1 c, GFrom c) => c a -> Vec (GPigeonholeSize c) a
gfrom :: c a -> Vec (GPigeonholeSize c) a
gfrom = \c a
x -> Rep1 @* c a -> Vec 'Z a -> Vec (GPigeonholeSize c) a
forall (c :: * -> *) x (n :: Nat).
GFromRep1 c =>
c x -> Vec n x -> Vec (PigeonholeSizeRep c n) x
gfromRep1 (c a -> Rep1 @* c a
forall k (f :: k -> *) (a :: k).
Generic1 @k f =>
f a -> Rep1 @k f a
G.from1 c a
x) Vec 'Z a
forall a. Vec 'Z a
VNil
type GFrom c = GFromRep1 (G.Rep1 c)
class GFromRep1 (c :: * -> *)  where
    gfromRep1 :: c x -> Vec n x -> Vec (PigeonholeSizeRep c n) x
instance (GFromRep1 a, GFromRep1 b) => GFromRep1 (a :*: b) where
    gfromRep1 :: (:*:) @* a b x
-> Vec n x -> Vec (PigeonholeSizeRep ((:*:) @* a b) n) x
gfromRep1 (a x
x :*: b x
y) Vec n x
z = a x
-> Vec (PigeonholeSizeRep b n) x
-> Vec (PigeonholeSizeRep a (PigeonholeSizeRep b n)) x
forall (c :: * -> *) x (n :: Nat).
GFromRep1 c =>
c x -> Vec n x -> Vec (PigeonholeSizeRep c n) x
gfromRep1 a x
x (b x -> Vec n x -> Vec (PigeonholeSizeRep b n) x
forall (c :: * -> *) x (n :: Nat).
GFromRep1 c =>
c x -> Vec n x -> Vec (PigeonholeSizeRep c n) x
gfromRep1 b x
y Vec n x
z)
instance GFromRep1 a => GFromRep1 (M1 d c a) where
    gfromRep1 :: M1 @* d c a x
-> Vec n x -> Vec (PigeonholeSizeRep (M1 @* d c a) n) x
gfromRep1 (M1 a x
a) Vec n x
z = a x -> Vec n x -> Vec (PigeonholeSizeRep a n) x
forall (c :: * -> *) x (n :: Nat).
GFromRep1 c =>
c x -> Vec n x -> Vec (PigeonholeSizeRep c n) x
gfromRep1 a x
a Vec n x
z
instance GFromRep1 Par1 where
    gfromRep1 :: Par1 x -> Vec n x -> Vec (PigeonholeSizeRep Par1 n) x
gfromRep1 (Par1 x
x) Vec n x
z = x
x x -> Vec n x -> Vec ('S n) x
forall (n :: Nat) a. a -> Vec n a -> Vec ('S n) a
::: Vec n x
z
instance GFromRep1 U1 where
    gfromRep1 :: U1 @* x -> Vec n x -> Vec (PigeonholeSizeRep (U1 @*) n) x
gfromRep1 U1 @* x
_U1 Vec n x
z = Vec n x
Vec (PigeonholeSizeRep (U1 @*) n) x
z
gto :: forall c a. (G.Generic1 c, GTo c) => Vec (GPigeonholeSize c) a -> c a
gto :: Vec (GPigeonholeSize c) a -> c a
gto = \Vec (GPigeonholeSize c) a
xs -> Rep1 @* c a -> c a
forall k (f :: k -> *) (a :: k).
Generic1 @k f =>
Rep1 @k f a -> f a
G.to1 (Rep1 @* c a -> c a) -> Rep1 @* c a -> c a
forall a b. (a -> b) -> a -> b
$ (Rep1 @* c a, Vec 'Z a) -> Rep1 @* c a
forall a b. (a, b) -> a
fst (Vec (GPigeonholeSize c) a -> (Rep1 @* c a, Vec 'Z a)
forall (c :: * -> *) (n :: Nat) x.
GToRep1 c =>
Vec (PigeonholeSizeRep c n) x -> (c x, Vec n x)
gtoRep1 Vec (GPigeonholeSize c) a
xs :: (G.Rep1 c a, Vec 'N.Z a))
type GTo c = GToRep1 (G.Rep1 c)
class GToRep1 (c :: * -> *) where
    gtoRep1 :: Vec (PigeonholeSizeRep c n) x -> (c x, Vec n x)
instance GToRep1 a => GToRep1 (M1 d c a) where
    gtoRep1 :: Vec (PigeonholeSizeRep (M1 @* d c a) n) x
-> (M1 @* d c a x, Vec n x)
gtoRep1 = (a x -> M1 @* d c a x)
-> (a x, Vec n x) -> (M1 @* d c a x, Vec n x)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first a x -> M1 @* d c a x
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 @k i c f p
M1 ((a x, Vec n x) -> (M1 @* d c a x, Vec n x))
-> (Vec (PigeonholeSizeRep a n) x -> (a x, Vec n x))
-> Vec (PigeonholeSizeRep a n) x
-> (M1 @* d c a x, Vec n x)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec (PigeonholeSizeRep a n) x -> (a x, Vec n x)
forall (c :: * -> *) (n :: Nat) x.
GToRep1 c =>
Vec (PigeonholeSizeRep c n) x -> (c x, Vec n x)
gtoRep1
instance (GToRep1 a, GToRep1 b) => GToRep1 (a :*: b) where
    gtoRep1 :: Vec (PigeonholeSizeRep ((:*:) @* a b) n) x
-> ((:*:) @* a b x, Vec n x)
gtoRep1 Vec (PigeonholeSizeRep ((:*:) @* a b) n) x
xs =
        let (a x
a, Vec (PigeonholeSizeRep b n) x
ys) = Vec (PigeonholeSizeRep a (PigeonholeSizeRep b n)) x
-> (a x, Vec (PigeonholeSizeRep b n) x)
forall (c :: * -> *) (n :: Nat) x.
GToRep1 c =>
Vec (PigeonholeSizeRep c n) x -> (c x, Vec n x)
gtoRep1 Vec (PigeonholeSizeRep a (PigeonholeSizeRep b n)) x
Vec (PigeonholeSizeRep ((:*:) @* a b) n) x
xs
            (b x
b, Vec n x
zs) = Vec (PigeonholeSizeRep b n) x -> (b x, Vec n x)
forall (c :: * -> *) (n :: Nat) x.
GToRep1 c =>
Vec (PigeonholeSizeRep c n) x -> (c x, Vec n x)
gtoRep1 Vec (PigeonholeSizeRep b n) x
ys
        in (a x
a a x -> b x -> (:*:) @* a b x
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) @k f g p
:*: b x
b, Vec n x
zs)
instance GToRep1 Par1 where
    gtoRep1 :: Vec (PigeonholeSizeRep Par1 n) x -> (Par1 x, Vec n x)
gtoRep1 (x ::: xs) = (x -> Par1 x
forall p. p -> Par1 p
Par1 x
x, Vec n x
xs)
instance GToRep1 U1 where
    gtoRep1 :: Vec (PigeonholeSizeRep (U1 @*) n) x -> (U1 @* x, Vec n x)
gtoRep1 Vec (PigeonholeSizeRep (U1 @*) n) x
xs = (U1 @* x
forall k (p :: k). U1 @k p
U1, Vec n x
Vec (PigeonholeSizeRep (U1 @*) n) x
xs)