packages feed

casadi-bindings-1.9.0.0: Casadi/Callback.hs

{-# 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