packages feed

nirum-0.3.0: src/Nirum/Targets/List.hs

{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
module Nirum.Targets.List ( targetProxiesQ
                          , targetProxyMapQ
                          , targetTypesQ
                          ) where

import Data.Proxy (Proxy (Proxy))
import Language.Haskell.TH ( Dec (InstanceD)
                           , Exp
                           , Info (ClassI)
                           , Q
                           , Type (AppT)
                           )
import Language.Haskell.TH.Lib (listE)
import Language.Haskell.TH.Syntax (reify, sequenceQ)

import Nirum.Package.Metadata (Target)

targetTypesQ :: Q [Type]
targetTypesQ = do
    ClassI _ instances <- reify ''Target
    return [t | InstanceD _ _ (AppT _ t) _ <- instances]

targetProxiesQ :: Q [Exp]
targetProxiesQ = do
    targetTypes <- targetTypesQ
    sequenceQ [[e|(Proxy :: Proxy $(return t))|] | t <- targetTypes]

targetProxyMapQ :: Q Exp -> Q Exp
targetProxyMapQ funcQ = do
    targetProxies <- targetProxiesQ
    listE [ [e|(targetName $(return p), $funcQ $(return p))|]
          | p <- targetProxies
          ]