packages feed

fficxx-0.7.0.0: src/FFICXX/Generate/Code/HsProxy.hs

{-# LANGUAGE OverloadedStrings #-}

module FFICXX.Generate.Code.HsProxy where

import qualified Data.List as L (foldr1)
--

import FFICXX.Generate.Util.HaskellSrcExts
  ( con,
    inapp,
    mkFun,
    mkVar,
    op,
    qualifier,
    tyapp,
    tycon,
    tylist,
  )
import qualified FFICXX.Runtime.CodeGen.Cxx as R
import Language.Haskell.Exts.Build (app, doE, listE, qualStmt, strE)
import Language.Haskell.Exts.Syntax (Decl (..))

genProxyInstance :: [Decl ()]
genProxyInstance =
  mkFun fname sig [] rhs Nothing
  where
    fname = "genImplProxy"
    v = mkVar
    sig = tycon "Q" `tyapp` tylist (tycon "Dec")
    rhs = doE [foreignSrcStmt, qualStmt retstmt]
    foreignSrcStmt =
      qualifier $
        (v "addModFinalizer")
          `app` ( v "addForeignSource"
                    `app` con "LangCxx"
                    `app` ( L.foldr1
                              (\x y -> inapp x (op "++") y)
                              [includeStatic]
                          )
                )
      where
        includeStatic =
          strE $
            concatMap
              (<> "\n")
              [R.renderCMacro (R.Include "MacroPatternMatch.h")]
    retstmt = v "pure" `app` listE []