web3-solidity-1.0.0.0: src/Data/Solidity/Prim/Tuple/TH.hs
{-# LANGUAGE TemplateHaskell #-}
-- |
-- Module : Data.Solidity.Prim.Tuple.TH
-- Copyright : Aleksandr Krupenkin 2016-2021
-- License : Apache-2.0
--
-- Maintainer : mail@akru.me
-- Stability : experimental
-- Portability : noportable
--
-- This module is for internal usage only.
-- It contains tuple abi encoding template haskell generator.
--
module Data.Solidity.Prim.Tuple.TH (tupleDecs) where
import Control.Monad (replicateM)
import Data.Proxy
import Language.Haskell.TH (DecsQ, Type (VarT), appT, clause, conT,
cxt, funD, instanceD, listE, newName, normalB,
tupleT)
import Data.Solidity.Abi (AbiGet, AbiPut, AbiType (..))
tupleDecs :: Int -> DecsQ
tupleDecs n = do
vars <- replicateM n $ newName "a"
let types = fmap (pure . VarT) vars
areDynamic = listE $ flip fmap types $ \t -> [| isDynamic (Proxy :: Proxy $(t)) |]
sequence $
[ instanceD (cxt $ map (appT $ conT ''AbiType) types) (appT (conT ''AbiType) (foldl appT (tupleT n) types))
[funD 'isDynamic [clause [] (normalB [|const (or $(areDynamic))|]) []]]
, instanceD (cxt $ map (appT $ conT ''AbiGet) types) (appT (conT ''AbiGet) (foldl appT (tupleT n) types)) []
, instanceD (cxt $ map (appT $ conT ''AbiPut) types) (appT (conT ''AbiPut) (foldl appT (tupleT n) types)) [] ]