{-# LANGUAGE TemplateHaskell #-} -- | -- Module : Codec.Scale.TH -- Copyright : Alexander Krupenkin 2016 -- License : BSD3 -- -- Maintainer : mail@akru.me -- Stability : experimental -- Portability : noportable -- -- It contains template haskell SCALE helper functions. -- module Codec.Scale.TH where import Control.Monad (replicateM) import Language.Haskell.TH (DecsQ, Type (VarT), appT, conT, cxt, instanceD, newName, tupleT) import Codec.Scale.Class (Decode, Encode) tupleInstances :: Int -> DecsQ tupleInstances n = do vars <- replicateM n $ newName "a" let types = fmap (pure . VarT) vars sequence $ [ instanceD (cxt $ map (appT $ conT ''Decode) types) (appT (conT ''Decode) (foldl appT (tupleT n) types)) [] , instanceD (cxt $ map (appT $ conT ''Encode) types) (appT (conT ''Encode) (foldl appT (tupleT n) types)) [] ]