{-# LANGUAGE ForeignFunctionInterface #-}
module Clingo.Raw.Configuration
(
    configurationRoot,
    configurationType,
    configurationDescription,

    -- * Functions to access arrays
    configurationArraySize,
    configurationArrayAt,
    
    -- * Functions to access maps
    configurationMapSize,
    configurationMapSubkeyName,
    configurationMapAt,

    -- * Functions to access values
    configurationValueIsAssigned,
    configurationValueGetSize,
    configurationValueGet,
    configurationValueSet
)
where

import Control.Monad.IO.Class

import Foreign
import Foreign.C

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

foreign import ccall "clingo.h clingo_configuration_root" configurationRootFFI ::
    Configuration -> Ptr Identifier -> IO CBool
foreign import ccall "clingo.h clingo_configuration_type" configurationTypeFFI ::
    Configuration -> Identifier -> Ptr ConfigurationType -> IO CBool
foreign import ccall "clingo.h clingo_configuration_description" configurationDescriptionFFI ::
    Configuration -> Identifier -> Ptr CString -> IO CBool
foreign import ccall "clingo.h clingo_configuration_array_size" configurationArraySizeFFI ::
    Configuration -> Word64 -> Ptr CSize -> IO CBool
foreign import ccall "clingo.h clingo_configuration_array_at" configurationArrayAtFFI ::
    Configuration -> Identifier -> CSize -> Ptr Identifier -> IO CBool
foreign import ccall "clingo.h clingo_configuration_map_size" configurationMapSizeFFI ::
    Configuration -> Identifier -> Ptr CSize -> IO CBool
foreign import ccall "clingo.h clingo_configuration_map_subkey_name" configurationMapSubkeyNameFFI ::
    Configuration -> Identifier -> CSize -> Ptr CString -> IO CBool
foreign import ccall "clingo.h clingo_configuration_map_at" configurationMapAtFFI ::
    Configuration -> Identifier -> CString -> Ptr Identifier -> IO CBool
foreign import ccall "clingo.h clingo_configuration_value_is_assigned" configurationValueIsAssignedFFI ::
    Configuration -> Identifier -> Ptr CBool -> IO CBool
foreign import ccall "clingo.h clingo_configuration_value_get_size" configurationValueGetSizeFFI ::
    Configuration -> Identifier -> Ptr CSize -> IO CBool
foreign import ccall "clingo.h clingo_configuration_value_get" configurationValueGetFFI ::
    Configuration -> Identifier -> CString -> CSize -> IO CBool
foreign import ccall "clingo.h clingo_configuration_value_set" configurationValueSetFFI ::
    Configuration -> Identifier -> CString -> IO CBool

configurationRoot :: MonadIO m => Configuration -> Ptr Identifier -> m CBool
configurationRoot a b = liftIO $ configurationRootFFI a b

configurationType :: MonadIO m => Configuration -> Identifier -> Ptr ConfigurationType -> m CBool
configurationType a b c = liftIO $ configurationTypeFFI a b c

configurationDescription :: MonadIO m => Configuration -> Identifier -> Ptr CString -> m CBool
configurationDescription a b c = liftIO $ configurationDescriptionFFI a b c

configurationArraySize :: MonadIO m => Configuration -> Word64 -> Ptr CSize -> m CBool
configurationArraySize a b c = liftIO $ configurationArraySizeFFI a b c

configurationArrayAt :: MonadIO m => Configuration -> Identifier -> CSize -> Ptr Identifier -> m CBool
configurationArrayAt a b c d = liftIO $ configurationArrayAtFFI a b c d

configurationMapSize :: MonadIO m => Configuration -> Identifier -> Ptr CSize -> m CBool
configurationMapSize a b c = liftIO $ configurationMapSizeFFI a b c

configurationMapSubkeyName :: MonadIO m => Configuration -> Identifier -> CSize -> Ptr CString -> m CBool
configurationMapSubkeyName a b c d = liftIO $ configurationMapSubkeyNameFFI a b c d

configurationMapAt :: MonadIO m => Configuration -> Identifier -> CString -> Ptr Identifier -> m CBool
configurationMapAt a b c d = liftIO $ configurationMapAtFFI a b c d

configurationValueIsAssigned :: MonadIO m => Configuration -> Identifier -> Ptr CBool -> m CBool
configurationValueIsAssigned a b c = liftIO $ configurationValueIsAssignedFFI a b c

configurationValueGetSize :: MonadIO m => Configuration -> Identifier -> Ptr CSize -> m CBool
configurationValueGetSize a b c = liftIO $ configurationValueGetSizeFFI a b c

configurationValueGet :: MonadIO m => Configuration -> Identifier -> CString -> CSize -> m CBool
configurationValueGet a b c d = liftIO $ configurationValueGetFFI a b c d

configurationValueSet :: MonadIO m => Configuration -> Identifier -> CString -> m CBool
configurationValueSet a b c = liftIO $ configurationValueSetFFI a b c