{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module FunPtr where
import Ivory.Compile.C.CmdlineFrontend
import Ivory.Language
f :: Def ('[Sint32] ':-> Sint32)
f = proc "f" (\ n -> body (ret (n + 1)))
invoke :: Def ('[ ProcPtr ('[Sint32] ':-> Sint32), Sint32] ':-> Sint32)
invoke = proc "invoke" (\ k n -> body (ret =<< indirect k n))
test :: Def ('[] ':-> Sint32)
test = proc "fun_ptr_test" (body (ret =<< call invoke (procPtr f) 10))
runFunPtr :: IO ()
runFunPtr = runCompiler [cmodule] [] initialOpts { outDir = Nothing }
cmodule :: Module
cmodule = package "FunPtr" $ do
incl f
incl test
incl invoke