{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
module Language.Haskell.Tools.AST.MakeASTReferences where
import Control.Reference ((&))
import Language.Haskell.TH
import Language.Haskell.Tools.AST.Ann (Ann, element)
toASTReferences :: Q [Dec] -> Q [Dec]
toASTReferences = fmap (map $ \case
SigD name (ForallT vars ctx (refType `AppT` (ctxOrig `AppT` dom `AppT` stage)
`AppT` _
`AppT` fldOrig
`AppT` _))
-> SigD name (ForallT vars ctx (refType `AppT` (ConT ''Ann `AppT` ctxOrig `AppT` dom `AppT` stage)
`AppT` (ConT ''Ann `AppT` ctxOrig `AppT` dom `AppT` stage)
`AppT` fldOrig
`AppT` fldOrig))
ValD pat (NormalB e) locs -> ValD pat (NormalB (InfixE (Just (VarE 'element)) (VarE '(&)) (Just e))) locs
d -> d)