{-# LANGUAGE ForeignFunctionInterface #-}
module Clingo.Raw.Solving
(
    solveHandleGet,
    solveHandleWait,
    solveHandleModel,
    solveHandleResume,
    solveHandleCancel,
    solveHandleClose
)
where

import Control.Monad.IO.Class

import Foreign
import Foreign.C.Types

import Clingo.Raw.Types
import Clingo.Raw.Enums

foreign import ccall "clingo.h clingo_solve_handle_get" 
                     solveHandleGetFFI ::
    SolveHandle -> Ptr SolveResult -> IO CBool
foreign import ccall "clingo.h clingo_solve_handle_wait"
                     solveHandleWaitFFI ::
    SolveHandle -> CDouble -> Ptr CBool -> IO ()
foreign import ccall "clingo.h clingo_solve_handle_model"
                     solveHandleModelFFI ::
    SolveHandle -> Ptr Model -> IO CBool
foreign import ccall "clingo.h clingo_solve_handle_resume"
                     solveHandleResumeFFI ::
    SolveHandle -> IO CBool
foreign import ccall "clingo.h clingo_solve_handle_cancel"
                     solveHandleCancelFFI ::
    SolveHandle -> IO CBool
foreign import ccall "clingo.h clingo_solve_handle_close"
                     solveHandleCloseFFI ::
    SolveHandle -> IO CBool

solveHandleGet :: MonadIO m => SolveHandle -> Ptr SolveResult -> m CBool
solveHandleGet a b = liftIO $ solveHandleGetFFI a b

solveHandleWait :: MonadIO m => SolveHandle -> CDouble -> Ptr CBool -> m ()
solveHandleWait a b c = liftIO $ solveHandleWaitFFI a b c

solveHandleModel :: MonadIO m => SolveHandle -> Ptr Model -> m CBool
solveHandleModel a b = liftIO $ solveHandleModelFFI a b

solveHandleResume :: MonadIO m => SolveHandle -> m CBool
solveHandleResume a = liftIO $ solveHandleResumeFFI a

solveHandleCancel :: MonadIO m => SolveHandle -> m CBool
solveHandleCancel a = liftIO $ solveHandleCancelFFI a

solveHandleClose :: MonadIO m => SolveHandle -> m CBool
solveHandleClose a = liftIO $ solveHandleCloseFFI a