{-# LANGUAGE CPP, Safe, TemplateHaskellQuotes #-}
module Data.Tuple.Append.TemplateHaskell (
defineTupleAddUpto, defineTupleAppendUpto
, defineUnboxedTupleAppendFunctionsUpto
, tupleAddL, tupleAddR, tupleAdd, tupleAppend, tupleAppendFor
, boxedTupleAddLFun, boxedTupleAddRFun, boxedTupleAppendFun
, unboxedTupleAddLFun, unboxedTupleAddRFun, unboxedTupleAppendFun
, makeBoxedTupleAddLFun, makeBoxedTupleAddRFun, makeBoxedTupleAppendFun
, makeUnboxedTupleAddLFun, makeUnboxedTupleAddRFun, makeUnboxedTupleAppendFun
, boxedAddLClause, boxedAddRClause, boxedAppendClause
, unboxedAddLClause, unboxedAddRClause, unboxedAppendClause
) where
import Control.Monad((<=<))
import Data.Char(chr, ord)
import Data.Tuple.Append.Class(TupleAddL((<++)), TupleAddR((++>)), TupleAppend((+++)))
import Language.Haskell.TH.Lib(DecsQ)
import Language.Haskell.TH.Quote(QuasiQuoter(QuasiQuoter))
import Language.Haskell.TH.Syntax(
Body(NormalB), Clause(Clause), Dec(FunD, InstanceD, SigD), Exp(TupE, UnboxedTupE, VarE), Name, Pat(TildeP, TupP, UnboxedTupP, VarP), Q, Type(AppT, ArrowT, ConT, TupleT, UnboxedTupleT, VarT)
, mkName
)
_nameZZ :: Name
_nameZZ :: Name
_nameZZ = String -> Name
mkName String
"x"
_varZZ :: Type
_varZZ :: Type
_varZZ = Name -> Type
VarT Name
_nameZZ
_patZZ :: Pat
_patZZ :: Pat
_patZZ = Name -> Pat
VarP Name
_nameZZ
_varNames :: Char -> [Name]
_varNames :: Char -> [Name]
_varNames Char
c = (Int -> Name) -> [Int] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Name
mkName (String -> Name) -> (Int -> String) -> Int -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
c Char -> String -> String
forall a. a -> [a] -> [a]
:) (String -> String) -> (Int -> String) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map (Int -> Char
chr (Int -> Char) -> (Char -> Int) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int
8272 Int -> Int -> Int
forall a. Num a => a -> a -> a
+) (Int -> Int) -> (Char -> Int) -> Char -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord) (String -> String) -> (Int -> String) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show) [Int
1 :: Int ..]
_uNames :: [Name]
_uNames :: [Name]
_uNames = Char -> [Name]
_varNames Char
'u'
_vNames :: [Name]
_vNames :: [Name]
_vNames = Char -> [Name]
_varNames Char
'v'
_tupleVar' :: Int -> [Name] -> Type
_tupleVar' :: Int -> [Name] -> Type
_tupleVar' Int
n [Name]
ns = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Type -> Type -> Type
AppT (Int -> Type
TupleT Int
n) ((Name -> Type) -> [Name] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Type
VarT (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
ns))
_utupleVar' :: Int -> [Name] -> Type
_utupleVar' :: Int -> [Name] -> Type
_utupleVar' Int
n [Name]
ns = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Type -> Type -> Type
AppT (Int -> Type
UnboxedTupleT Int
n) ((Name -> Type) -> [Name] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Type
VarT (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
ns))
_tupleP'' :: ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' :: ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' = (([Pat] -> Pat) -> ([Name] -> [Pat]) -> [Name] -> Pat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name -> Pat) -> [Name] -> [Pat]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Pat
VarP)
_tupleP' :: [Name] -> Pat
_tupleP' :: [Name] -> Pat
_tupleP' = ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' (Pat -> Pat
TildeP (Pat -> Pat) -> ([Pat] -> Pat) -> [Pat] -> Pat
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Pat] -> Pat
TupP)
_utupleP' :: [Name] -> Pat
_utupleP' :: [Name] -> Pat
_utupleP' = ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' [Pat] -> Pat
UnboxedTupP
_tupleRange :: Int -> [Int]
#if MIN_VERSION_ghc_prim(0,7,0)
_tupleRange = enumFromTo 0
#else
_tupleRange :: Int -> [Int]
_tupleRange = (Int
0 Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:) ([Int] -> [Int]) -> (Int -> [Int]) -> Int -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> [Int]
forall a. Enum a => a -> a -> [a]
enumFromTo Int
2
#endif
_tupleCheck :: Int -> Bool
#if MIN_VERSION_ghc_prim(0,7,0)
_tupleCheck = (0 <=)
#else
_tupleCheck :: Int -> Bool
_tupleCheck Int
0 = Bool
True
_tupleCheck Int
n = Int
2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n
#endif
#if MIN_VERSION_template_haskell(2,16,0)
_tupleB' :: ([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' :: ([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
f = Exp -> Body
NormalB (Exp -> Body) -> ([Name] -> Exp) -> [Name] -> Body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe Exp] -> Exp
f ([Maybe Exp] -> Exp) -> ([Name] -> [Maybe Exp]) -> [Name] -> Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name -> Maybe Exp) -> [Name] -> [Maybe Exp]
forall a b. (a -> b) -> [a] -> [b]
map (Exp -> Maybe Exp
forall a. a -> Maybe a
Just (Exp -> Maybe Exp) -> (Name -> Exp) -> Name -> Maybe Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Exp
VarE)
#else
_tupleB' :: ([Exp] -> Exp) -> [Name] -> Body
_tupleB' f = NormalB . f . map VarE
#endif
_clause :: [Pat] -> Body -> Name -> Dec
_clause :: [Pat] -> Body -> Name -> Dec
_clause [Pat]
ps Body
b = (Name -> [Clause] -> Dec
`FunD` [[Pat] -> Body -> [Dec] -> Clause
Clause [Pat]
ps Body
b []])
#if MIN_VERSION_template_haskell(2,16,0)
_appendClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Int -> Name -> Dec
#else
_appendClause :: ([Pat] -> Pat) -> ([Exp] -> Exp) -> Int -> Int -> Name -> Dec
#endif
_appendClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Int -> Name -> Dec
_appendClause [Pat] -> Pat
fp [Maybe Exp] -> Exp
fe Int
m Int
n = [Pat] -> Body -> Name -> Dec
_clause [ ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' [Pat] -> Pat
fp [Name]
um, ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' [Pat] -> Pat
fp [Name]
vn] (([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
fe ([Name]
um [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
vn))
where um :: [Name]
um = Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
m [Name]
_uNames
vn :: [Name]
vn = Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
_vNames
#if MIN_VERSION_template_haskell(2,16,0)
_addLClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
#else
_addLClause :: ([Pat] -> Pat) -> ([Exp] -> Exp) -> Int -> Name -> Dec
#endif
_addLClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addLClause [Pat] -> Pat
fp [Maybe Exp] -> Exp
fe Int
n = [Pat] -> Body -> Name -> Dec
_clause [ Pat
_patZZ, ([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' [Pat] -> Pat
fp [Name]
vars] (([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
fe (Name
_nameZZ Name -> [Name] -> [Name]
forall a. a -> [a] -> [a]
: [Name]
vars))
where vars :: [Name]
vars = Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
_vNames
#if MIN_VERSION_template_haskell(2,16,0)
_addRClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
#else
_addRClause :: ([Pat] -> Pat) -> ([Exp] -> Exp) -> Int -> Name -> Dec
#endif
_addRClause :: ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addRClause [Pat] -> Pat
fp [Maybe Exp] -> Exp
fe Int
n = [Pat] -> Body -> Name -> Dec
_clause [([Pat] -> Pat) -> [Name] -> Pat
_tupleP'' [Pat] -> Pat
fp [Name]
vars, Pat
_patZZ] (([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
fe ([Name]
vars [Name] -> Name -> [Name]
forall 𝐯 x 𝐯x. TupleAddR 𝐯 x 𝐯x => 𝐯 -> x -> 𝐯x
++> Name
_nameZZ))
where vars :: [Name]
vars = Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
_vNames
boxedAppendClause
:: Int
-> Int
-> Name
-> Dec
boxedAppendClause :: Int -> Int -> Name -> Dec
boxedAppendClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Int -> Name -> Dec
_appendClause [Pat] -> Pat
TupP [Maybe Exp] -> Exp
TupE
unboxedAppendClause
:: Int
-> Int
-> Name
-> Dec
unboxedAppendClause :: Int -> Int -> Name -> Dec
unboxedAppendClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Int -> Name -> Dec
_appendClause [Pat] -> Pat
UnboxedTupP [Maybe Exp] -> Exp
UnboxedTupE
boxedAddLClause
:: Int
-> Name
-> Dec
boxedAddLClause :: Int -> Name -> Dec
boxedAddLClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addLClause [Pat] -> Pat
TupP [Maybe Exp] -> Exp
TupE
unboxedAddLClause
:: Int
-> Name
-> Dec
unboxedAddLClause :: Int -> Name -> Dec
unboxedAddLClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addLClause [Pat] -> Pat
UnboxedTupP [Maybe Exp] -> Exp
UnboxedTupE
boxedAddRClause
:: Int
-> Name
-> Dec
boxedAddRClause :: Int -> Name -> Dec
boxedAddRClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addRClause [Pat] -> Pat
TupP [Maybe Exp] -> Exp
TupE
unboxedAddRClause
:: Int
-> Name
-> Dec
unboxedAddRClause :: Int -> Name -> Dec
unboxedAddRClause = ([Pat] -> Pat) -> ([Maybe Exp] -> Exp) -> Int -> Name -> Dec
_addRClause [Pat] -> Pat
UnboxedTupP [Maybe Exp] -> Exp
UnboxedTupE
_tupleB :: [Name] -> Body
_tupleB :: [Name] -> Body
_tupleB = ([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
TupE
_utupleB :: [Name] -> Body
_utupleB :: [Name] -> Body
_utupleB = ([Maybe Exp] -> Exp) -> [Name] -> Body
_tupleB' [Maybe Exp] -> Exp
UnboxedTupE
_arr :: Type -> Type -> Type
_arr :: Type -> Type -> Type
_arr Type
l Type
r = Type
ArrowT Type -> Type -> Type
`AppT` Type
l Type -> Type -> Type
`AppT` Type
r
_tupType :: [Type] -> Type
_tupType :: [Type] -> Type
_tupType [Type]
ns = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Type -> Type -> Type
AppT (Int -> Type
TupleT ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ns)) [Type]
ns
_utupType :: [Type] -> Type
_utupType :: [Type] -> Type
_utupType [Type]
ns = (Type -> Type -> Type) -> Type -> [Type] -> Type
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Type -> Type -> Type
AppT (Int -> Type
UnboxedTupleT ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ns)) [Type]
ns
_signature :: Name -> Type -> Type -> Type -> Dec
_signature :: Name -> Type -> Type -> Type -> Dec
_signature Name
nm Type
ta Type
tb Type
tc = Name -> Type -> Dec
SigD Name
nm (Type
ta Type -> Type -> Type
`_arr` (Type
tb Type -> Type -> Type
`_arr` Type
tc))
boxedTupleAppendFun
:: Name
-> [Type]
-> [Type]
-> [Dec]
boxedTupleAppendFun :: Name -> [Type] -> [Type] -> [Dec]
boxedTupleAppendFun Name
nm [Type]
l [Type]
r = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm ([Type] -> Type
_tupType [Type]
l) ([Type] -> Type
_tupType [Type]
r) ([Type] -> Type
_tupType ([Type]
l [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
r))
, Int -> Int -> Name -> Dec
boxedAppendClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
l) ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
r) Name
nm
]
unboxedTupleAppendFun
:: Name
-> [Type]
-> [Type]
-> [Dec]
unboxedTupleAppendFun :: Name -> [Type] -> [Type] -> [Dec]
unboxedTupleAppendFun Name
nm [Type]
l [Type]
r = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm ([Type] -> Type
_utupType [Type]
l) ([Type] -> Type
_utupType [Type]
r) ([Type] -> Type
_utupType ([Type]
l [Type] -> [Type] -> [Type]
forall a. [a] -> [a] -> [a]
++ [Type]
r))
, Int -> Int -> Name -> Dec
unboxedAppendClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
l) ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
r) Name
nm
]
boxedTupleAddLFun
:: Name
-> Type
-> [Type]
-> [Dec]
boxedTupleAddLFun :: Name -> Type -> [Type] -> [Dec]
boxedTupleAddLFun Name
nm Type
t [Type]
ts = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm Type
t ([Type] -> Type
_tupType [Type]
ts) ([Type] -> Type
_tupType (Type
t Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: [Type]
ts))
, Int -> Name -> Dec
boxedAddLClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ts) Name
nm
]
unboxedTupleAddLFun
:: Name
-> Type
-> [Type]
-> [Dec]
unboxedTupleAddLFun :: Name -> Type -> [Type] -> [Dec]
unboxedTupleAddLFun Name
nm Type
t [Type]
ts = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm Type
t ([Type] -> Type
_utupType [Type]
ts) ([Type] -> Type
_utupType (Type
t Type -> [Type] -> [Type]
forall a. a -> [a] -> [a]
: [Type]
ts))
, Int -> Name -> Dec
unboxedAddLClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ts) Name
nm
]
boxedTupleAddRFun
:: Name
-> [Type]
-> Type
-> [Dec]
boxedTupleAddRFun :: Name -> [Type] -> Type -> [Dec]
boxedTupleAddRFun Name
nm [Type]
ts Type
t = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm ([Type] -> Type
_tupType [Type]
ts) Type
t ([Type] -> Type
_tupType ([Type]
ts [Type] -> Type -> [Type]
forall 𝐯 x 𝐯x. TupleAddR 𝐯 x 𝐯x => 𝐯 -> x -> 𝐯x
++> Type
t))
, Int -> Name -> Dec
boxedAddRClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ts) Name
nm
]
unboxedTupleAddRFun
:: Name
-> [Type]
-> Type
-> [Dec]
unboxedTupleAddRFun :: Name -> [Type] -> Type -> [Dec]
unboxedTupleAddRFun Name
nm [Type]
ts Type
t = [
Name -> Type -> Type -> Type -> Dec
_signature Name
nm ([Type] -> Type
_utupType [Type]
ts) Type
t ([Type] -> Type
_utupType ([Type]
ts [Type] -> Type -> [Type]
forall 𝐯 x 𝐯x. TupleAddR 𝐯 x 𝐯x => 𝐯 -> x -> 𝐯x
++> Type
t))
, Int -> Name -> Dec
unboxedAddRClause ([Type] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Type]
ts) Name
nm
]
makeBoxedTupleAppendFun
:: Name
-> [Type]
-> [Type]
-> DecsQ
makeBoxedTupleAppendFun :: Name -> [Type] -> [Type] -> DecsQ
makeBoxedTupleAppendFun Name
nm [Type]
l = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> ([Type] -> [Dec]) -> [Type] -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> [Type] -> [Type] -> [Dec]
boxedTupleAppendFun Name
nm [Type]
l
makeUnboxedTupleAppendFun
:: Name
-> [Type]
-> [Type]
-> DecsQ
makeUnboxedTupleAppendFun :: Name -> [Type] -> [Type] -> DecsQ
makeUnboxedTupleAppendFun Name
nm [Type]
l = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> ([Type] -> [Dec]) -> [Type] -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> [Type] -> [Type] -> [Dec]
unboxedTupleAppendFun Name
nm [Type]
l
makeBoxedTupleAddLFun
:: Name
-> Type
-> [Type]
-> DecsQ
makeBoxedTupleAddLFun :: Name -> Type -> [Type] -> DecsQ
makeBoxedTupleAddLFun Name
nm Type
t = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> ([Type] -> [Dec]) -> [Type] -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Type -> [Type] -> [Dec]
boxedTupleAddLFun Name
nm Type
t
makeUnboxedTupleAddLFun
:: Name
-> Type
-> [Type]
-> DecsQ
makeUnboxedTupleAddLFun :: Name -> Type -> [Type] -> DecsQ
makeUnboxedTupleAddLFun Name
nm Type
t = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> ([Type] -> [Dec]) -> [Type] -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Type -> [Type] -> [Dec]
unboxedTupleAddLFun Name
nm Type
t
makeBoxedTupleAddRFun
:: Name
-> [Type]
-> Type
-> DecsQ
makeBoxedTupleAddRFun :: Name -> [Type] -> Type -> DecsQ
makeBoxedTupleAddRFun Name
nm [Type]
ts = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> (Type -> [Dec]) -> Type -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> [Type] -> Type -> [Dec]
boxedTupleAddRFun Name
nm [Type]
ts
makeUnboxedTupleAddRFun
:: Name
-> [Type]
-> Type
-> DecsQ
makeUnboxedTupleAddRFun :: Name -> [Type] -> Type -> DecsQ
makeUnboxedTupleAddRFun Name
nm [Type]
ts = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> (Type -> [Dec]) -> Type -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> [Type] -> Type -> [Dec]
unboxedTupleAddRFun Name
nm [Type]
ts
_simpleInstance :: Name -> Name -> Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstance :: Name -> Name -> Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstance Name
tc Name
f Type
tca Type
tcb Type
tcc Name -> Dec
d = Maybe Overlap -> [Type] -> Type -> [Dec] -> Dec
InstanceD Maybe Overlap
forall a. Maybe a
Nothing [] (Name -> Type
ConT Name
tc Type -> Type -> Type
`AppT` Type
tca Type -> Type -> Type
`AppT` Type
tcb Type -> Type -> Type
`AppT` Type
tcc) [Name -> Dec
d Name
f]
_simpleInstanceAppend :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAppend :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAppend = Name -> Name -> Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstance ''TupleAppend '(+++)
_simpleInstanceAddL :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddL :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddL = Name -> Name -> Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstance ''TupleAddL '(<++)
_simpleInstanceAddR :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddR :: Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddR = Name -> Name -> Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstance ''TupleAddR '(++>)
tupleAppend
:: Int
-> Int
-> Dec
tupleAppend :: Int -> Int -> Dec
tupleAppend Int
m Int
n = Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAppend (Int -> [Name] -> Type
_tupleVar' Int
m [Name]
_uNames) (Int -> [Name] -> Type
_tupleVar' Int
n [Name]
_vNames) (Int -> [Name] -> Type
_tupleVar' (Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
n) (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
m [Name]
_uNames [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
_vNames)) (Int -> Int -> Name -> Dec
boxedAppendClause Int
m Int
n)
tupleAppendFor
:: Int
-> [Dec]
tupleAppendFor :: Int -> [Dec]
tupleAppendFor Int
l = [Int -> Int -> Dec
tupleAppend Int
m Int
n | Int
m <- Int -> [Int]
_tupleRange Int
l, let n :: Int
n = Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
m, Int -> Bool
_tupleCheck Int
n ]
tupleAddL
:: Int
-> Dec
tupleAddL :: Int -> Dec
tupleAddL Int
n = Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddL Type
_varZZ (Int -> [Name] -> Type
_tupleVar' Int
n [Name]
_vNames) (Int -> [Name] -> Type
_tupleVar' (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Name
_nameZZ Name -> [Name] -> [Name]
forall a. a -> [a] -> [a]
: [Name]
_vNames)) (Int -> Name -> Dec
boxedAddLClause Int
n)
tupleAddR
:: Int
-> Dec
tupleAddR :: Int -> Dec
tupleAddR Int
n = Type -> Type -> Type -> (Name -> Dec) -> Dec
_simpleInstanceAddR (Int -> [Name] -> Type
_tupleVar' Int
n [Name]
_vNames) Type
_varZZ (Int -> [Name] -> Type
_tupleVar' (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
_vNames [Name] -> Name -> [Name]
forall 𝐯 x 𝐯x. TupleAddR 𝐯 x 𝐯x => 𝐯 -> x -> 𝐯x
++> Name
_nameZZ)) (Int -> Name -> Dec
boxedAddRClause Int
n)
tupleAdd
:: Int
-> [Dec]
tupleAdd :: Int -> [Dec]
tupleAdd Int
n
| Int -> Bool
_tupleCheck Int
n Bool -> Bool -> Bool
&& Int -> Bool
_tupleCheck (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) = [Int -> Dec
tupleAddL Int
n, Int -> Dec
tupleAddR Int
n]
| Bool
otherwise = []
_errorQuasiQuoter :: a -> Q b
_errorQuasiQuoter :: a -> Q b
_errorQuasiQuoter = Q b -> a -> Q b
forall a b. a -> b -> a
const (String -> Q b
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"The quasi quoter can only be used to define declarations")
defineTupleAddUpto
:: QuasiQuoter
defineTupleAddUpto :: QuasiQuoter
defineTupleAddUpto = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> DecsQ)
-> QuasiQuoter
QuasiQuoter String -> Q Exp
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Pat
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Type
forall a b. a -> Q b
_errorQuasiQuoter (Int -> DecsQ
_defineTupleAddUpTo (Int -> DecsQ) -> (String -> Int) -> String -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. Read a => String -> a
read)
_defineTupleAddUpTo :: Int -> DecsQ
_defineTupleAddUpTo :: Int -> DecsQ
_defineTupleAddUpTo Int
n = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Int -> Dec) -> [Int] -> [Dec]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Dec
tupleAddL [Int]
ns [Dec] -> [Dec] -> [Dec]
forall a. [a] -> [a] -> [a]
++ (Int -> Dec) -> [Int] -> [Dec]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Dec
tupleAddR [Int]
ns)
where ns :: [Int]
ns = [Int] -> [Int]
forall a. [a] -> [a]
reverse ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
filter (Int -> Bool
_tupleCheck (Int -> Bool) -> (Int -> Int) -> Int -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int
forall a. Enum a => a -> a
succ) (Int -> [Int]
_tupleRange Int
n))
defineTupleAppendUpto
:: QuasiQuoter
defineTupleAppendUpto :: QuasiQuoter
defineTupleAppendUpto = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> DecsQ)
-> QuasiQuoter
QuasiQuoter String -> Q Exp
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Pat
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Type
forall a b. a -> Q b
_errorQuasiQuoter ([Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Dec] -> DecsQ) -> (String -> [Dec]) -> String -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> [Dec]
tupleAppendFor (Int -> [Dec]) -> (String -> [Int]) -> String -> [Dec]
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Int -> Int -> [Int]
forall a. Enum a => a -> a -> [a]
enumFromTo Int
0 (Int -> [Int]) -> (String -> Int) -> String -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. Read a => String -> a
read))
defineUnboxedTupleAppendFunctionsUpto
:: QuasiQuoter
defineUnboxedTupleAppendFunctionsUpto :: QuasiQuoter
defineUnboxedTupleAppendFunctionsUpto = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> DecsQ)
-> QuasiQuoter
QuasiQuoter String -> Q Exp
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Pat
forall a b. a -> Q b
_errorQuasiQuoter String -> Q Type
forall a b. a -> Q b
_errorQuasiQuoter (Int -> DecsQ
_unboxedTupleConcats (Int -> DecsQ) -> (String -> Int) -> String -> DecsQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. Read a => String -> a
read)
_unboxedTupleConcats :: Int -> DecsQ
_unboxedTupleConcats :: Int -> DecsQ
_unboxedTupleConcats Int
r = [Dec] -> DecsQ
forall (f :: * -> *) a. Applicative f => a -> f a
pure [ Dec
u | Int
m <- [Int
rInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
2, Int
rInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
3 .. Int
2], Int
n <- [Int
rInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
2, Int
rInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
3 .. Int
2], Dec
u <- Name -> [Type] -> [Type] -> [Dec]
unboxedTupleAppendFun (String -> Name
mkName (String
"unboxedAppend_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
m String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n)) ((Name -> Type) -> [Name] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Type
VarT (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
m [Name]
_uNames)) ((Name -> Type) -> [Name] -> [Type]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Type
VarT (Int -> [Name] -> [Name]
forall a. Int -> [a] -> [a]
take Int
n [Name]
_vNames)) ]