preql-0.4: src/Preql/Wire/Tuples.hs
-- | Template Haskell macros to generate tuple instances for FromSql & ToSql
module Preql.Wire.Tuples where
import Preql.QuasiQuoter.Common (alphabet)
import Language.Haskell.TH
deriveToSqlTuple :: Int -> Q [Dec]
deriveToSqlTuple size = do
names <- traverse newName (take size alphabet)
Just classN <- lookupTypeName "ToSql"
Just fieldN <- lookupTypeName "ToSqlField"
Just toSql <- lookupValueName "toSql"
Just runFieldEncoder <- lookupValueName "runFieldEncoder"
Just toSqlField <- lookupValueName "toSqlField"
let
context = [ ConT fieldN `AppT` VarT n | n <- names ]
instanceHead = ConT classN `AppT` foldl AppT (TupleT size) (map VarT names)
method = FunD toSql
[Clause
[TupP (map VarP names)]
(NormalB (ListE [ VarE runFieldEncoder `AppE` VarE toSqlField `AppE` VarE n | n <- names ]))
[]] -- no where clause on the toSql definition
return [InstanceD Nothing context instanceHead [method]]