{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE TemplateHaskell #-}

module Database.MSSQLServer.Query.Template ( rowTupleQ
                                           , resultSetTupleQ
                                           , rpcResponseSetTupleQ
                                           , rpcOutputSetTupleQ
                                           , rpcResultSetTupleQ
                                           , rpcQuerySetTupleQ
                                           , rpcParamSetTupleQ
                                           ) where

import Data.Monoid((<>))
import Database.Tds.Message
import Language.Haskell.TH
import Data.List (foldl')



rowTupleQ :: Int -> Q Dec
rowTupleQ :: Int -> Q Dec
rowTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rowTuple Int
n

rowTuple :: Int -> Dec
rowTuple :: Int -> Dec
rowTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Type -> Type -> Type
AppT (Name -> Type
ConT ''Data) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))) [Int
1..Int
n])
#else
  (map (\i ->ClassP ''Data [(VarT (mkName $ "a" <> show i))]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"Row")) (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Name -> [Clause] -> Dec
FunD (String -> Name
mkName String
"fromListOfRawBytes")
    [ [Pat] -> Body -> [Dec] -> Clause
Clause
      [ [Pat] -> Pat
ListP (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"m" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n])
      , [Pat] -> Pat
ListP (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n])
      ]
#if MIN_VERSION_template_haskell(2,16,0)
      (Exp -> Body
NormalB ([Maybe Exp] -> Exp
TupE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]) ))
#else
      (NormalB (TupE (map (\i ->VarE (mkName $ "d" <> show i)) [1..n]) ))
#endif
      (forall a b. (a -> b) -> [a] -> [b]
map Int -> Dec
d [Int
1..Int
n])
    , [Pat] -> Body -> [Dec] -> Clause
Clause [Pat
WildP,Pat
WildP] (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE
                                      (Name -> Exp
VarE 'error)
                                      (Lit -> Exp
LitE (String -> Lit
StringL (String
"fromListOfRawBytes: List length must be " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
n)))
                                    )
                           ) []
    ]
  ]
  where
    d :: Int -> Dec
    d :: Int -> Dec
d Int
i = Pat -> Body -> [Dec] -> Dec
ValD (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
      (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE
                 (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'fromRawBytes)
                   (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"mcdTypeInfo")) (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"m" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
                 )
                 (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))
               )
      ) []



resultSetTupleQ :: Int -> Q Dec
resultSetTupleQ :: Int -> Q Dec
resultSetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
resultSetTuple Int
n

resultSetTuple :: Int -> Dec
resultSetTuple :: Int -> Dec
resultSetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"Result")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> (forall a. Show a => a -> String
show Int
i)))) [Int
1..Int
n])
#else
  (map (\i ->ClassP (mkName "Result") [(VarT (mkName $ "a" <> show i))]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"ResultSet")) (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Pat -> Body -> [Dec] -> Dec
ValD (Name -> Pat
VarP (String -> Name
mkName String
"resultSetParser"))
    (Exp -> Body
NormalB (Maybe ModName -> [Stmt] -> Exp
DoE
#if MIN_VERSION_template_haskell(2,17,0)
               forall a. Maybe a
Nothing
#endif
               (
                 (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> [a] -> [b]
map [Int
1..Int
n] forall a b. (a -> b) -> a -> b
$ \Int
i ->
                     Pat -> Exp -> Stmt
BindS
                     (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i )))
                     (Exp -> Type -> Exp
SigE
                      (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"resultParser")) (if Int
iforall a. Eq a => a -> a -> Bool
==Int
n then (Name -> Exp
ConE 'True) else (Name -> Exp
ConE 'False)) )
                      ([TyVarBndr Specificity] -> Cxt -> Type -> Type
ForallT
#if MIN_VERSION_template_haskell(2,17,0)
                        [forall flag. Name -> flag -> TyVarBndr flag
PlainTV (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i) Specificity
SpecifiedSpec]
#else
                        [PlainTV (mkName $ "a" <> show i)]
#endif
#if MIN_VERSION_template_haskell(2,10,0)
                        [Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"Result")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))]
#else
                        [ClassP (mkName "Result") [VarT (mkName $ "a" <> show i)]]
#endif
                        (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"Parser'")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
                      )
                     )
                 )
                 forall a. Semigroup a => a -> a -> a
<>
#if MIN_VERSION_template_haskell(2,16,0)
                 [(Exp -> Stmt
NoBindS (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'return) ([Maybe Exp] -> Exp
TupE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]) )) )]
#else
                 [(NoBindS (AppE (VarE 'return) (TupE (map (\i->VarE (mkName $ "r" <> show i)) [1..n]) )) )]
#endif
               )
             )
    ) []
  ]



rpcResponseSetTupleQ :: Int -> Q Dec
rpcResponseSetTupleQ :: Int -> Q Dec
rpcResponseSetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rpcResponseSetTuple Int
n

rpcResponseSetTuple :: Int -> Dec
rpcResponseSetTuple :: Int -> Dec
rpcResponseSetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Int
i->[Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcOutputSet")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))
                  ,Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResultSet")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))
                  ]) [Int
1..Int
n])
#else
  (concatMap (\i->[ClassP (mkName "RpcOutputSet") [(VarT (mkName $ "a" <> show i))]
                  ,ClassP (mkName "RpcResultSet") [(VarT (mkName $ "b" <> show i))]
                  ]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResponseSet"))
   (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Type -> Type -> Type
AppT (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResponse")) (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Name -> Type
VarT (String -> Name
mkName (String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) )) ) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Pat -> Body -> [Dec] -> Dec
ValD (Name -> Pat
VarP (String -> Name
mkName String
"rpcResponseSetParser"))
    (Exp -> Body
NormalB (Maybe ModName -> [Stmt] -> Exp
DoE
#if MIN_VERSION_template_haskell(2,17,0)
               forall a. Maybe a
Nothing
#endif
               (
                 (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> [a] -> [b]
map [Int
1..Int
n] forall a b. (a -> b) -> a -> b
$ \Int
i ->
                     Pat -> Exp -> Stmt
BindS
                     (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i )))
                     (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"rpcResponseParser")) (if Int
iforall a. Eq a => a -> a -> Bool
==Int
n then (Name -> Exp
ConE 'True) else (Name -> Exp
ConE 'False)))
                 )
                 forall a. Semigroup a => a -> a -> a
<>
#if MIN_VERSION_template_haskell(2,16,0)
                 [(Exp -> Stmt
NoBindS (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'return) ([Maybe Exp] -> Exp
TupE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]) )) )]
#else
                 [(NoBindS (AppE (VarE 'return) (TupE (map (\i->VarE (mkName $ "r" <> show i)) [1..n]) )) )]
#endif
               )
             )
    ) []
  ]



rpcOutputSetTupleQ :: Int -> Q Dec
rpcOutputSetTupleQ :: Int -> Q Dec
rpcOutputSetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rpcOutputSetTuple Int
n

rpcOutputSetTuple :: Int -> Dec
rpcOutputSetTuple :: Int -> Dec
rpcOutputSetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Type -> Type -> Type
AppT (Name -> Type
ConT ''Data) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))) [Int
1..Int
n])
#else
  (map (\i ->ClassP ''Data [(VarT (mkName $ "a" <> show i))]) [1..n])
#endif
  (Type -> Type -> Type
AppT
    (Name -> Type
ConT (String -> Name
mkName String
"RpcOutputSet"))
    (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Int -> Type
TupleT Int
n) [Int
1..Int
n])
  )
  [Name -> [Clause] -> Dec
FunD (String -> Name
mkName String
"fromReturnValues")
   [[Pat] -> Body -> [Dec] -> Clause
Clause
     [[Pat] -> Pat
ListP (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n])]
#if MIN_VERSION_template_haskell(2,16,0)
     (Exp -> Body
NormalB ([Maybe Exp] -> Exp
TupE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n])))
#else
     (NormalB (TupE (map (\i ->VarE (mkName $ "d" <> show i)) [1..n])))
#endif

     (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Pat -> Body -> [Dec] -> Dec
ValD (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
               (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE
                         (Exp -> Exp -> Exp
AppE
                           (Name -> Exp
VarE (String -> Name
mkName String
"fromRawBytes"))
                           (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"rvTypeInfo")) (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
                         )
                         (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"rvRawBytes")) (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))))
               ) []
          ) [Int
1..Int
n]
     )
   ,[Pat] -> Body -> [Dec] -> Clause
Clause [Pat
WildP] (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'error) (Lit -> Exp
LitE (String -> Lit
StringL forall a b. (a -> b) -> a -> b
$ String
"fromReturnValues: List length must be " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
n)))) []
   ]
  ]



rpcResultSetTupleQ :: Int -> Q Dec
rpcResultSetTupleQ :: Int -> Q Dec
rpcResultSetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rpcResultSetTuple Int
n

rpcResultSetTuple :: Int -> Dec
rpcResultSetTuple :: Int -> Dec
rpcResultSetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResult")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> (forall a. Show a => a -> String
show Int
i)))) [Int
1..Int
n])
#else
  (map (\i ->ClassP (mkName "RpcResult") [(VarT (mkName $ "a" <> show i))]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResultSet")) (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Pat -> Body -> [Dec] -> Dec
ValD (Name -> Pat
VarP (String -> Name
mkName String
"rpcResultSetParser"))
    (Exp -> Body
NormalB (Maybe ModName -> [Stmt] -> Exp
DoE
#if MIN_VERSION_template_haskell(2,17,0)
               forall a. Maybe a
Nothing
#endif
               (
                 (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a b. (a -> b) -> [a] -> [b]
map [Int
1..Int
n] forall a b. (a -> b) -> a -> b
$ \Int
i ->
                     Pat -> Exp -> Stmt
BindS
                     (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i )))
                     (Exp -> Type -> Exp
SigE (Name -> Exp
VarE (String -> Name
mkName String
"rpcResultParser"))
                      ([TyVarBndr Specificity] -> Cxt -> Type -> Type
ForallT
#if MIN_VERSION_template_haskell(2,17,0)
                        [forall flag. Name -> flag -> TyVarBndr flag
PlainTV (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i) Specificity
SpecifiedSpec]
#else
                        [PlainTV (mkName $ "a" <> show i)]
#endif
#if MIN_VERSION_template_haskell(2,10,0)
                        [Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcResult")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))]
#else
                        [ClassP (mkName "RpcResult") [VarT (mkName $ "a" <> show i)]]
#endif
                        (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"Parser'")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
                      )
                     )
                 )
                 forall a. Semigroup a => a -> a -> a
<>
#if MIN_VERSION_template_haskell(2,16,0)
                 [(Exp -> Stmt
NoBindS (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE 'return) ([Maybe Exp] -> Exp
TupE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]) )) )]
#else
                 [(NoBindS (AppE (VarE 'return) (TupE (map (\i->VarE (mkName $ "r" <> show i)) [1..n]) )) )]
#endif
               )
             )
    ) []
  ]



rpcQuerySetTupleQ :: Int -> Q Dec
rpcQuerySetTupleQ :: Int -> Q Dec
rpcQuerySetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rpcQuerySetTuple Int
n

rpcQuerySetTuple :: Int -> Dec
rpcQuerySetTuple :: Int -> Dec
rpcQuerySetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Int
i->[Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcQueryId")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))
                  ,Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcParamSet")) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))
                  ]) [Int
1..Int
n])
#else
  (concatMap (\i->[ClassP (mkName "RpcQueryId") [(VarT (mkName $ "a" <> show i))]
                  ,ClassP (mkName "RpcParamSet") [(VarT (mkName $ "b" <> show i))]
                  ]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcQuerySet"))
    (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Type -> Type -> Type
AppT (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcQuery")) (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) (Name -> Type
VarT (String -> Name
mkName (String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) )) ) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Name -> [Clause] -> Dec
FunD (String -> Name
mkName String
"toRpcRequest")
   [[Pat] -> Body -> [Dec] -> Clause
Clause
    [[Pat] -> Pat
TupP
     (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Name -> Cxt -> [Pat] -> Pat
ConP (String -> Name
mkName String
"RpcQuery")
#if MIN_VERSION_template_haskell(2,18,0)
                    []
#endif
                    [Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i),Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)]) [Int
1..Int
n])
    ]
    (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE
               (Name -> Exp
ConE (String -> Name
mkName String
"RpcRequest"))
               ([Exp] -> Exp
ListE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]))))
    (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Pat -> Body -> [Dec] -> Dec
ValD (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"r" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
           (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"toRpcReqBatch"))
                            (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))) (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"b" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) []) [Int
1..Int
n])
   ]
  ]



rpcParamSetTupleQ :: Int -> Q Dec
rpcParamSetTupleQ :: Int -> Q Dec
rpcParamSetTupleQ Int
n = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Dec
rpcParamSetTuple Int
n

rpcParamSetTuple :: Int -> Dec
rpcParamSetTuple :: Int -> Dec
rpcParamSetTuple Int
n =
#if MIN_VERSION_template_haskell(2,11,0)
  Maybe Overlap -> Cxt -> Type -> [Dec] -> Dec
InstanceD forall a. Maybe a
Nothing
#else
  InstanceD
#endif
#if MIN_VERSION_template_haskell(2,10,0)
  (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Type -> Type -> Type
AppT (Name -> Type
ConT ''Data) (Name -> Type
VarT (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))) [Int
1..Int
n])
#else
  (map (\i ->ClassP ''Data [(VarT (mkName $ "a" <> show i))]) [1..n])
#endif
  (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcParamSet")) (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\Type
x Int
i -> Type -> Type -> Type
AppT Type
x (Type -> Type -> Type
AppT (Name -> Type
ConT (String -> Name
mkName String
"RpcParam")) (Name -> Type
VarT (String -> Name
mkName (String
"a" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i))) ) ) (Int -> Type
TupleT Int
n) [Int
1..Int
n]))
  [Name -> [Clause] -> Dec
FunD (String -> Name
mkName String
"toRpcReqBatchParams")
   [[Pat] -> Body -> [Dec] -> Clause
Clause
    [[Pat] -> Pat
TupP (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n])]
    (Exp -> Body
NormalB ([Exp] -> Exp
ListE (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i ->Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"p" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)) [Int
1..Int
n]) ))
    (forall a b. (a -> b) -> [a] -> [b]
map (\Int
i->Pat -> Body -> [Dec] -> Dec
ValD (Pat -> Pat
BangP (Name -> Pat
VarP (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"p" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))
              (Exp -> Body
NormalB (Exp -> Exp -> Exp
AppE (Name -> Exp
VarE (String -> Name
mkName String
"rpcReqBatchParam")) (Name -> Exp
VarE (String -> Name
mkName forall a b. (a -> b) -> a -> b
$ String
"d" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> String
show Int
i)))) []) [Int
1..Int
n])
   ]
  ]