{-# OPTIONS_GHC -Wall #-} module Casadi.Callback ( makeCallback , functionSolveSafe ) where import Foreign.C.Types import Foreign.Ptr ( Ptr, FunPtr ) import Foreign.ForeignPtr ( newForeignPtr_ ) import Casadi.Wrappers.CToolsInstances ( ) import Casadi.Wrappers.Data import Casadi.Marshal ( withMarshal ) import Casadi.WrapReturn ( WrapReturn(..) ) -- direct wrapper to a safe version of "solve" foreign import ccall safe "CasADi__Function__solve" c_CasADi__Function__solve_safe :: Ptr Function' -> IO () casADi__Function__solve_safe :: Function -> IO () casADi__Function__solve_safe x0 = withMarshal x0 $ \x0' -> c_CasADi__Function__solve_safe x0' >>= wrapReturn -- | safe version of solve functionSolveSafe :: FunctionClass a => a -> IO () functionSolveSafe x = casADi__Function__solve_safe (castFunction x) type CasadiCallback' = Ptr Function' -> IO CInt foreign import ccall "wrapper" mkCallback :: CasadiCallback' -> IO (FunPtr CasadiCallback') foreign import ccall safe "new_callback_haskell" c_newCallbackHaskell :: FunPtr CasadiCallback' -> IO (Ptr Callback') -- | add a callback to an NLPSolver makeCallback :: (Function -> IO CInt) -> IO Callback makeCallback callback = do -- safely wrap the callback into the C-friendly version let callback' :: CasadiCallback' callback' ptrFx = do foreignCFun <- newForeignPtr_ ptrFx callback (Function foreignCFun) -- turn the callback into a FunPtr callbackFunPtr <- mkCallback callback' :: IO (FunPtr CasadiCallback') -- create the callback object c_newCallbackHaskell callbackFunPtr >>= wrapReturn