{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}
module Data.SwizzleSet.Class.TH (
classSwizzle, instanceSwizzleTuple
) where
import GHC.Generics
import Language.Haskell.TH hiding (Type)
import Data.Kind
import Data.Bool
import Template.Tools
classSwizzle :: Int -> DecsQ
classSwizzle :: Int -> DecsQ
classSwizzle Int
n =
[Q Dec] -> DecsQ
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence ([Q Dec] -> DecsQ) -> [Q Dec] -> DecsQ
forall a b. (a -> b) -> a -> b
$ ([Q Dec] -> [Q Dec])
-> ([Q Dec] -> [Q Dec]) -> Bool -> [Q Dec] -> [Q Dec]
forall a. a -> a -> Bool -> a
bool [Q Dec] -> [Q Dec]
forall a. a -> a
id (\[Q Dec]
x -> (Q Dec
instanceGswizzle1K1 Q Dec -> [Q Dec] -> [Q Dec]
forall a. a -> [a] -> [a]
: [Q Dec]
x)) (Int
n Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1) [
Int -> Q Dec
classGswizzle Int
n,
Int -> Q Dec
instanceGswizzleM1 Int
n,
Int -> Q Dec
instanceGswizzleProd Int
n,
Int -> Q Dec
prodProd Int
n,
Int -> Q Dec
classSwizzleClass Int
n ]
classGswizzle :: Int -> Q Dec
classGswizzle :: Int -> Q Dec
classGswizzle Int
n =
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"s" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
s -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
a ->
Q Cxt -> Name -> [TyVarBndr ()] -> [FunDep] -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> Name -> [TyVarBndr ()] -> [FunDep] -> [m Dec] -> m Dec
classD ([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt []) (Int -> Name
nameGswizzle Int
n) [Name -> TyVarBndr ()
plainTV Name
s, Name -> TyVarBndr ()
plainTV Name
b] []
[Int -> Name -> Name -> Q Dec
typeGx Int
n Name
s Name
b, Int -> Name -> Name -> Name -> Q Dec
sigGx Int
n Name
s Name
b Name
a]
typeGx :: Int -> Name -> Name -> Q Dec
typeGx :: Int -> Name -> Name -> Q Dec
typeGx Int
i Name
s Name
b = String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"k" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
k ->
Name
-> [TyVarBndr ()]
-> FamilyResultSig
-> Maybe InjectivityAnn
-> Q Dec
forall (m :: * -> *).
Quote m =>
Name
-> [TyVarBndr ()]
-> FamilyResultSig
-> Maybe InjectivityAnn
-> m Dec
openTypeFamilyD (Int -> Name
nameGxU Int
i)
[Name -> TyVarBndr ()
plainTV Name
s, Name -> TyVarBndr ()
plainTV Name
b] (Pred -> FamilyResultSig
kindSig (Pred -> FamilyResultSig) -> Pred -> FamilyResultSig
forall a b. (a -> b) -> a -> b
$ Name -> Pred
varK Name
k Pred -> Pred -> Pred
`arrK` Name -> Pred
conK ''Type) Maybe InjectivityAnn
forall a. Maybe a
Nothing
sigGx :: Int -> Name -> Name -> Name -> Q Dec
sigGx :: Int -> Name -> Name -> Name -> Q Dec
sigGx Int
i Name
s Name
b Name
a = Name -> Q Pred -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Pred -> m Dec
sigD (Int -> Name
nameGxL Int
i) (Q Pred -> Q Dec) -> Q Pred -> Q Dec
forall a b. (a -> b) -> a -> b
$
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
s Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a)
Q Pred -> Q Pred -> Q Pred
`arrT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b
Q Pred -> Q Pred -> Q Pred
`arrT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
s Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a)
instanceGswizzle1K1 :: Q Dec
instanceGswizzle1K1 :: Q Dec
instanceGswizzle1K1 =
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"i" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
i -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
a -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
v ->
Q Cxt -> Q Pred -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Pred -> [m Dec] -> m Dec
instanceD ([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [])
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (String -> Name
mkName String
"GSwizzleSet1") Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Q Pred
k1ia Name
i Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
[Name -> Name -> Name -> Q Dec
typeGxK1 Name
i Name
a Name
b, Name -> Q Dec
funGxK1 Name
v]
k1ia :: Name -> Name -> TypeQ
k1ia :: Name -> Name -> Q Pred
k1ia Name
i Name
a = Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''K1 Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
i Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a
typeGxK1 :: Name -> Name -> Name -> Q Dec
typeGxK1 :: Name -> Name -> Name -> Q Dec
typeGxK1 Name
i Name
a Name
b = Q TySynEqn -> Q Dec
forall (m :: * -> *). Quote m => m TySynEqn -> m Dec
tySynInstD
(Q TySynEqn -> Q Dec) -> Q TySynEqn -> Q Dec
forall a b. (a -> b) -> a -> b
$ Maybe [TyVarBndr ()] -> Q Pred -> Q Pred -> Q TySynEqn
forall (m :: * -> *).
Quote m =>
Maybe [TyVarBndr ()] -> m Pred -> m Pred -> m TySynEqn
tySynEqn Maybe [TyVarBndr ()]
forall a. Maybe a
Nothing (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (String -> Name
mkName String
"GX") Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Q Pred
k1ia Name
i Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b) (Name -> Name -> Q Pred
k1ia Name
i Name
b)
funGxK1 :: Name -> Q Dec
funGxK1 :: Name -> Q Dec
funGxK1 Name
v = Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (String -> Name
mkName String
"gx") [
[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause [Name -> [Q Pat] -> Q Pat
forall (m :: * -> *). Quote m => Name -> [m Pat] -> m Pat
conP 'K1 [Q Pat
forall (m :: * -> *). Quote m => m Pat
wildP], Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
v] (Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB (Q Exp -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE 'K1 Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
v) []
]
instanceGswizzleM1 :: Int -> Q Dec
instanceGswizzleM1 :: Int -> Q Dec
instanceGswizzleM1 Int
n =
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"i" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
i -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"c" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
c -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
a ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"s" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
s -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
v ->
Q Cxt -> Q Pred -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Pred -> [m Dec] -> m Dec
instanceD (Int -> Name -> Name -> Q Cxt
cxtGswizzleM1 Int
n Name
a Name
b)
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Name -> Q Pred
m1ica Name
i Name
c Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
[Int -> Name -> Name -> Name -> Name -> Q Dec
typeGxM1 Int
n Name
i Name
c Name
a Name
b, Int -> Name -> Name -> Q Dec
funGxM1 Int
n Name
s Name
v]
cxtGswizzleM1 :: Int -> Name -> Name -> CxtQ
cxtGswizzleM1 :: Int -> Name -> Name -> Q Cxt
cxtGswizzleM1 Int
i Name
a Name
b = [Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b]
m1ica :: Name -> Name -> Name -> TypeQ
m1ica :: Name -> Name -> Name -> Q Pred
m1ica Name
i Name
c Name
a = Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''M1 Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
i Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a
m1ict :: Name -> Name -> TypeQ -> TypeQ
m1ict :: Name -> Name -> Q Pred -> Q Pred
m1ict Name
i Name
c Q Pred
t = Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''M1 Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
i Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Q Pred
t
typeGxM1 :: Int -> Name -> Name -> Name -> Name -> Q Dec
typeGxM1 :: Int -> Name -> Name -> Name -> Name -> Q Dec
typeGxM1 Int
n Name
i Name
c Name
a Name
b = Q TySynEqn -> Q Dec
forall (m :: * -> *). Quote m => m TySynEqn -> m Dec
tySynInstD (Q TySynEqn -> Q Dec) -> Q TySynEqn -> Q Dec
forall a b. (a -> b) -> a -> b
$ Maybe [TyVarBndr ()] -> Q Pred -> Q Pred -> Q TySynEqn
forall (m :: * -> *).
Quote m =>
Maybe [TyVarBndr ()] -> m Pred -> m Pred -> m TySynEqn
tySynEqn Maybe [TyVarBndr ()]
forall a. Maybe a
Nothing
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Name -> Q Pred
m1ica Name
i Name
c Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
(Name -> Name -> Q Pred -> Q Pred
m1ict Name
i Name
c (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b))
funGxM1 :: Int -> Name -> Name -> Q Dec
funGxM1 :: Int -> Name -> Name -> Q Dec
funGxM1 Int
i Name
s Name
v = Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (Int -> Name
nameGxL Int
i) [[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause
[Name -> [Q Pat] -> Q Pat
forall (m :: * -> *). Quote m => Name -> [m Pat] -> m Pat
conP 'M1 [Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
s], Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
v]
(Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB (Q Exp -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE 'M1 Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Int -> Name
nameGxL Int
i) Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
s Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
v)) []]
instanceGswizzleProd :: Int -> Q Dec
instanceGswizzleProd :: Int -> Q Dec
instanceGswizzleProd Int
n =
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"i" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
i -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"c" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
c -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
a ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"g" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
g ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"s" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
s -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"t" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
t -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
v ->
Q Cxt -> Q Pred -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Pred -> [m Dec] -> m Dec
instanceD (Int -> Name -> Name -> Name -> Q Cxt
cxtGswizzleProd Int
n Name
a Name
g Name
b)
(Int -> Name -> Name -> Name -> Name -> Name -> Q Pred
instanceHeadProd Int
n Name
i Name
c Name
a Name
g Name
b)
[Int -> Name -> Name -> Name -> Name -> Name -> Q Dec
typeGxProd Int
n Name
i Name
c Name
a Name
g Name
b, Int -> Name -> Name -> Name -> Q Dec
funGxProd Int
n Name
v Name
s Name
t]
cxtGswizzleProd :: Int -> Name -> Name -> Name -> CxtQ
cxtGswizzleProd :: Int -> Name -> Name -> Name -> Q Cxt
cxtGswizzleProd Int
n Name
a Name
g Name
b = case Int
n of
Int
1 -> [Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
1) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b]
Int
_ -> [Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle (Int -> Name) -> Int -> Name
forall a b. (a -> b) -> a -> b
$ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
g Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b]
instanceHeadProd :: Int ->
Name -> Name -> Name -> Name -> Name -> TypeQ
instanceHeadProd :: Int -> Name -> Name -> Name -> Name -> Name -> Q Pred
instanceHeadProd Int
n Name
i Name
c Name
a Name
g Name
b = case Int
n of
Int
1 -> Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Name -> Name -> Q Pred
aProdG Name
i Name
c Name
a Name
g Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b
Int
_ -> Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Name -> Name -> Q Pred
aProdG Name
i Name
c Name
a Name
g Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b
typeGxProd :: Int -> Name -> Name -> Name -> Name -> Name -> Q Dec
typeGxProd :: Int -> Name -> Name -> Name -> Name -> Name -> Q Dec
typeGxProd Int
n Name
i Name
c Name
a Name
g Name
b = Q TySynEqn -> Q Dec
forall (m :: * -> *). Quote m => m TySynEqn -> m Dec
tySynInstD (Q TySynEqn -> Q Dec) -> Q TySynEqn -> Q Dec
forall a b. (a -> b) -> a -> b
$ Maybe [TyVarBndr ()] -> Q Pred -> Q Pred -> Q TySynEqn
forall (m :: * -> *).
Quote m =>
Maybe [TyVarBndr ()] -> m Pred -> m Pred -> m TySynEqn
tySynEqn Maybe [TyVarBndr ()]
forall a. Maybe a
Nothing
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Name -> Name -> Name -> Q Pred
aProdG Name
i Name
c Name
a Name
g Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
(case Int
n of
Int
1 -> Name -> Name -> Q Pred -> Q Pred -> Q Pred
aProdGT
Name
i Name
c (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT Name
gxxyu Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b) (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
g)
Int
_ -> Name -> Name -> Q Pred -> Q Pred -> Q Pred
aProdGT
Name
i Name
c (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a) (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT Name
gxxyu Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
g Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b))
where gxxyu :: Name
gxxyu = Int -> Name
nameGxxyU Int
n
aProdG :: Name -> Name -> Name -> Name -> TypeQ
aProdG :: Name -> Name -> Name -> Name -> Q Pred
aProdG Name
i Name
c Name
a Name
g =
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''M1 Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
i Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a) Q Pred -> Q Pred -> Q Pred
`prodT`
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
g
aProdGT :: Name -> Name -> TypeQ -> TypeQ -> TypeQ
aProdGT :: Name -> Name -> Q Pred -> Q Pred -> Q Pred
aProdGT Name
i Name
c Q Pred
a Q Pred
g =
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''M1 Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
i Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Q Pred
a) Q Pred -> Q Pred -> Q Pred
`prodT` Q Pred
g
funGxProd :: Int -> Name -> Name -> Name -> Q Dec
funGxProd :: Int -> Name -> Name -> Name -> Q Dec
funGxProd Int
n Name
v Name
s Name
t = Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (Int -> Name
nameGxL Int
n) [
[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause [Q Pat -> Name -> Q Pat -> Q Pat
forall (m :: * -> *). Quote m => m Pat -> Name -> m Pat -> m Pat
infixP (Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
s) '(:*:) (Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
t), Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
v]
(Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB
(Q Exp -> Q Body) -> (Q Exp -> Q Exp) -> Q Exp -> Q Body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Q Exp -> Q Exp -> Q Exp
prodPostOrPre Int
n (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Name -> Q Exp) -> Name -> Q Exp
forall a b. (a -> b) -> a -> b
$ Int -> Name -> Name -> Name
nameGOrA Int
n Name
s Name
t)
(Q Exp -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Int -> Name
nameGxxyL Int
n)
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Int -> Name -> Name -> Name
nameAOrG Int
n Name
s Name
t)
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
v
) [] ]
prodPostOrPre :: Int -> ExpQ -> ExpQ -> ExpQ
prodPostOrPre :: Int -> Q Exp -> Q Exp -> Q Exp
prodPostOrPre Int
1 Q Exp
e Q Exp
b = Maybe (Q Exp) -> Q Exp -> Maybe (Q Exp) -> Q Exp
forall (m :: * -> *).
Quote m =>
Maybe (m Exp) -> m Exp -> Maybe (m Exp) -> m Exp
infixE (Q Exp -> Maybe (Q Exp)
forall a. a -> Maybe a
Just Q Exp
b) (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE '(:*:)) (Q Exp -> Maybe (Q Exp)
forall a. a -> Maybe a
Just Q Exp
e)
prodPostOrPre Int
_ Q Exp
e Q Exp
b = Maybe (Q Exp) -> Q Exp -> Maybe (Q Exp) -> Q Exp
forall (m :: * -> *).
Quote m =>
Maybe (m Exp) -> m Exp -> Maybe (m Exp) -> m Exp
infixE (Q Exp -> Maybe (Q Exp)
forall a. a -> Maybe a
Just Q Exp
e) (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
conE '(:*:)) (Q Exp -> Maybe (Q Exp)
forall a. a -> Maybe a
Just Q Exp
b)
nameGxxyU :: Int -> Name
nameGxxyU :: Int -> Name
nameGxxyU = \case Int
1 -> Int -> Name
nameGxU Int
1; Int
i -> Int -> Name
nameGxU (Int -> Name) -> Int -> Name
forall a b. (a -> b) -> a -> b
$ Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
nameAOrG :: Int -> Name -> Name -> Name
nameAOrG :: Int -> Name -> Name -> Name
nameAOrG Int
i Name
a Name
b = case Int
i of Int
1 -> Name
a; Int
_ -> Name
b
nameGOrA :: Int -> Name -> Name -> Name
nameGOrA :: Int -> Name -> Name -> Name
nameGOrA Int
i Name
a Name
b = case Int
i of Int
1 -> Name
b; Int
_ -> Name
a
nameGxxyL :: Int -> Name
nameGxxyL :: Int -> Name
nameGxxyL = \case Int
1 -> Int -> Name
nameGxL Int
1; Int
i -> Int -> Name
nameGxL (Int -> Name) -> Int -> Name
forall a b. (a -> b) -> a -> b
$ Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
classSwizzleClass :: Int -> Q Dec
classSwizzleClass :: Int -> Q Dec
classSwizzleClass Int
n =
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"s" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
ta -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"s" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
fs -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
v ->
Q Cxt -> Name -> [TyVarBndr ()] -> [FunDep] -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> Name -> [TyVarBndr ()] -> [FunDep] -> [m Dec] -> m Dec
classD ([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt []) (Int -> Name
nameSwizzle Int
n) [Name -> TyVarBndr ()
plainTV Name
ta, Name -> TyVarBndr ()
plainTV Name
b] [] [
Int -> Name -> Name -> Q Dec
typeX Int
n Name
ta Name
b,
Int -> Name -> Name -> Q Dec
sigX Int
n Name
ta Name
b,
Int -> Name -> Name -> Q Dec
defaultX Int
n Name
ta Name
b,
Int -> Name -> Name -> Q Dec
defaultFunX Int
n Name
fs Name
v ]
typeX :: Int -> Name -> Name -> Q Dec
typeX :: Int -> Name -> Name -> Q Dec
typeX Int
i Name
s Name
b = Name
-> [TyVarBndr ()]
-> FamilyResultSig
-> Maybe InjectivityAnn
-> Q Dec
forall (m :: * -> *).
Quote m =>
Name
-> [TyVarBndr ()]
-> FamilyResultSig
-> Maybe InjectivityAnn
-> m Dec
openTypeFamilyD (Int -> Name
nameXU Int
i) [Name -> TyVarBndr ()
plainTV Name
s, Name -> TyVarBndr ()
plainTV Name
b] FamilyResultSig
noSig Maybe InjectivityAnn
forall a. Maybe a
Nothing
sigX :: Int -> Name -> Name -> Q Dec
sigX :: Int -> Name -> Name -> Q Dec
sigX Int
i Name
a Name
b = Name -> Q Pred -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Pred -> m Dec
sigD (Int -> Name
nameXL Int
i) (Q Pred -> Q Dec) -> Q Pred -> Q Dec
forall a b. (a -> b) -> a -> b
$
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`arrT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
`arrT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameXU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
instanceSwizzleTuple :: Int -> DecsQ
instanceSwizzleTuple :: Int -> DecsQ
instanceSwizzleTuple Int
n = [Dec] -> [Dec] -> [Dec]
forall a. [a] -> [a] -> [a]
(++)
([Dec] -> [Dec] -> [Dec]) -> DecsQ -> Q ([Dec] -> [Dec])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int -> Int -> Q Dec
`instanceSwizzleTuple_` Int
n) (Int -> Q Dec) -> [Int] -> DecsQ
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
`mapM` [Int
1 .. Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
n Int
26]
Q ([Dec] -> [Dec]) -> DecsQ -> DecsQ
forall a b. Q (a -> b) -> Q a -> Q b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> DecsQ
deriveGeneric Int
n
instanceSwizzleTuple_ :: Int -> Int -> Q Dec
instanceSwizzleTuple_ :: Int -> Int -> Q Dec
instanceSwizzleTuple_ Int
i Int
n =
(Int -> Q Name) -> [Int] -> Q [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName (String -> Q Name) -> (Int -> String) -> Int -> Q Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([String]
vars [String] -> Int -> String
forall a. HasCallStack => [a] -> Int -> a
!!)) [Int
0 .. Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1] Q [Name] -> ([Name] -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \[Name]
ns -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"x" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
x ->
Q Cxt -> Q Pred -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Pred -> [m Dec] -> m Dec
instanceD ([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [])
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameSwizzle Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` [Name] -> Q Pred
tupT [Name]
ns Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
x)
[Int -> [Name] -> Name -> Q Dec
typeXFromTuple Int
i [Name]
ns Name
x]
typeXFromTuple :: Int -> [Name] -> Name -> Q Dec
typeXFromTuple :: Int -> [Name] -> Name -> Q Dec
typeXFromTuple Int
i [Name]
ns Name
x =
let ns' :: [Name]
ns' = [Name] -> Int -> Name -> [Name]
forall a. [a] -> Int -> a -> [a]
setX [Name]
ns (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Name
x in
Q TySynEqn -> Q Dec
forall (m :: * -> *). Quote m => m TySynEqn -> m Dec
tySynInstD (Q TySynEqn -> Q Dec) -> Q TySynEqn -> Q Dec
forall a b. (a -> b) -> a -> b
$
Maybe [TyVarBndr ()] -> Q Pred -> Q Pred -> Q TySynEqn
forall (m :: * -> *).
Quote m =>
Maybe [TyVarBndr ()] -> m Pred -> m Pred -> m TySynEqn
tySynEqn Maybe [TyVarBndr ()]
forall a. Maybe a
Nothing (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameXU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` [Name] -> Q Pred
tupT [Name]
ns Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
x) ([Name] -> Q Pred
tupT [Name]
ns')
setX :: [a] -> Int -> a -> [a]
setX :: forall a. [a] -> Int -> a -> [a]
setX [] Int
_ a
_ = []
setX (a
_ : [a]
xs) Int
0 a
y = a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs
setX (a
x : [a]
xs) Int
i a
y = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> Int -> a -> [a]
forall a. [a] -> Int -> a -> [a]
setX [a]
xs (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) a
y
deriveGeneric :: Int -> DecsQ
deriveGeneric :: Int -> DecsQ
deriveGeneric Int
i = do
Pred
t <- [Name] -> Q Pred
tupT ([Name] -> Q Pred) -> Q [Name] -> Q Pred
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int -> Q [Name]
newNameAbc Int
i
Name -> Cxt -> Q Bool
isInstance ''Generic [Pred
t] Q Bool -> (Bool -> DecsQ) -> DecsQ
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= DecsQ -> DecsQ -> Bool -> DecsQ
forall a. a -> a -> Bool -> a
bool
((Dec -> [Dec] -> [Dec]
forall a. a -> [a] -> [a]
: []) (Dec -> [Dec]) -> Q Dec -> DecsQ
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Q Cxt -> Q Pred -> Q Dec
forall (m :: * -> *). Quote m => m Cxt -> m Pred -> m Dec
standaloneDerivD ([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [])
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Generic Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Pred -> Q Pred
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Pred
t))
([Dec] -> DecsQ
forall a. a -> Q a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [])
newNameAbc :: Int -> Q [Name]
newNameAbc :: Int -> Q [Name]
newNameAbc Int
i = String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName (String -> Q Name) -> [String] -> Q [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
`mapM` Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
i [String]
vars
vars :: [String]
vars :: [String]
vars = ((Char -> String -> String
forall a. a -> [a] -> [a]
: String
"") (Char -> String) -> String -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char
'a' .. Char
'z']) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [ String
cs String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
c] | String
cs <- [String]
vars, Char
c <- [Char
'a' .. Char
'z'] ]
nameXL :: Int -> Name
nameXL :: Int -> Name
nameXL = String -> Name
mkName (String -> Name) -> (Int -> String) -> Int -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> String -> String
forall a. a -> [a] -> [a]
: String
"") (Char -> String) -> (Int -> Char) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
alphabet
defaultX :: Int -> Name -> Name -> Q Dec
defaultX :: Int -> Name -> Name -> Q Dec
defaultX Int
i Name
a Name
b = Name -> Q Pred -> Q Dec
forall (m :: * -> *). Quote m => Name -> m Pred -> m Dec
defaultSigD (Int -> Name
nameXL Int
i) (Q Pred -> Q Dec) -> (Q Pred -> Q Pred) -> Q Pred -> Q Dec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [TyVarBndr Specificity] -> Q Cxt -> Q Pred -> Q Pred
forall (m :: * -> *).
Quote m =>
[TyVarBndr Specificity] -> m Cxt -> m Pred -> m Pred
forallT [] (Int -> Name -> Name -> Q Cxt
defaultXContext Int
i Name
a Name
b) (Q Pred -> Q Dec) -> Q Pred -> Q Dec
forall a b. (a -> b) -> a -> b
$
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`arrT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
`arrT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameXU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
defaultXContext :: Int -> Name -> Name -> CxtQ
defaultXContext :: Int -> Name -> Name -> Q Cxt
defaultXContext Int
i Name
a Name
b = [Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Generic Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a,
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Generic Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameXU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b),
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
i)
Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Rep Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a)
Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b,
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Rep Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameXU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b) Q Pred -> Q Pred -> Q Pred
`eqT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
i) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Rep Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b)
]
defaultFunX :: Int -> Name -> Name -> Q Dec
defaultFunX :: Int -> Name -> Name -> Q Dec
defaultFunX Int
i Name
s Name
v = Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (Int -> Name
nameXL Int
i) [[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause [Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
s, Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
v]
(Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB (Q Exp -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$
Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE 'to Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Int -> Name
nameGxL Int
i)
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE 'from Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
s)
Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
v
))
[]]
alphabet :: Int -> Char
alphabet :: Int -> Char
alphabet Int
i | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
26 = String -> Char
forall a. HasCallStack => String -> a
error (String -> Char) -> String -> Char
forall a b. (a -> b) -> a -> b
$ String
"no such alphabet: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i
alphabet Int
i = ((String
"xyz" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. [a] -> [a]
reverse [Char
'a' .. Char
'w']) String -> Int -> Char
forall a. HasCallStack => [a] -> Int -> a
!!) (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1 Int
i
prodProd :: Int -> DecQ
prodProd :: Int -> Q Dec
prodProd Int
n = String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"a" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
a -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"b" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
b -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"c" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
c ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
v ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"x" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
x -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"y" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
y -> String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"z" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
z ->
String -> Q Name
forall (m :: * -> *). Quote m => String -> m Name
newName String
"v" Q Name -> (Name -> Q Dec) -> Q Dec
forall a b. Q a -> (a -> Q b) -> Q b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Name
vf ->
Q Cxt -> Q Pred -> [Q Dec] -> Q Dec
forall (m :: * -> *).
Quote m =>
m Cxt -> m Pred -> [m Dec] -> m Dec
instanceD
([Q Pred] -> Q Cxt
forall (m :: * -> *). Quote m => [m Pred] -> m Cxt
cxt [
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`prodT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c)) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
v,
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''Push Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`prodT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c))
Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
v)
])
( Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGswizzle Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` ((Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b) Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
v
)
[
Q TySynEqn -> Q Dec
forall (m :: * -> *). Quote m => m TySynEqn -> m Dec
tySynInstD (Maybe [TyVarBndr ()] -> Q Pred -> Q Pred -> Q TySynEqn
forall (m :: * -> *).
Quote m =>
Maybe [TyVarBndr ()] -> m Pred -> m Pred -> m TySynEqn
tySynEqn Maybe [TyVarBndr ()]
forall a. Maybe a
Nothing
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
((Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b) Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
v)
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT ''P Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT`
(Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
conT (Int -> Name
nameGxU Int
n) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
a Q Pred -> Q Pred -> Q Pred
`prodT` (Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
b Q Pred -> Q Pred -> Q Pred
`prodT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
c)) Q Pred -> Q Pred -> Q Pred
forall (m :: * -> *). Quote m => m Pred -> m Pred -> m Pred
`appT` Name -> Q Pred
forall (m :: * -> *). Quote m => Name -> m Pred
varT Name
v))),
Name -> [Q Clause] -> Q Dec
forall (m :: * -> *). Quote m => Name -> [m Clause] -> m Dec
funD (Int -> Name
nameGxL Int
n) [[Q Pat] -> Q Body -> [Q Dec] -> Q Clause
forall (m :: * -> *).
Quote m =>
[m Pat] -> m Body -> [m Dec] -> m Clause
clause
[ (Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
x Q Pat -> Q Pat -> Q Pat
`prodP` Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
y) Q Pat -> Q Pat -> Q Pat
`prodP` Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
z,
Name -> Q Pat
forall (m :: * -> *). Quote m => Name -> m Pat
varP Name
vf
]
(Q Exp -> Q Body
forall (m :: * -> *). Quote m => m Exp -> m Body
normalB (Q Exp -> Q Body) -> Q Exp -> Q Body
forall a b. (a -> b) -> a -> b
$ Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE 'push Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE`
(Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE (Int -> Name
nameGxL Int
n) Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
x Q Exp -> Q Exp -> Q Exp
`prodE` (Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
y Q Exp -> Q Exp -> Q Exp
`prodE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
z)) Q Exp -> Q Exp -> Q Exp
forall (m :: * -> *). Quote m => m Exp -> m Exp -> m Exp
`appE` Name -> Q Exp
forall (m :: * -> *). Quote m => Name -> m Exp
varE Name
vf)
)
[]]
]
class Push x where type P x :: k -> Data.Kind.Type; push :: x a -> P x a
instance Push (a :*: (b :*: c)) where
type P (a :*: (b :*: c)) = (a :*: b) :*: c
push :: forall (a :: k). (:*:) a (b :*: c) a -> P (a :*: (b :*: c)) a
push (a a
x :*: (b a
y :*: c a
z)) = (a a
x a a -> b a -> (:*:) a b a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: b a
y) (:*:) a b a -> c a -> (:*:) (a :*: b) c a
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
:*: c a
z