-- GENERATED by C->Haskell Compiler, version 0.23.1 Snowbounder, 31 Oct 2014 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "./Cudd/Hook.chs" #-}
{-#LANGUAGE ForeignFunctionInterface #-}

module Cudd.Hook (
    cuddAddHook,
    cuddRemoveHook,
    HookTyp,
    HookFP,
    CuddHookType(..)
    ) where

import System.IO
import Foreign
import Foreign.Ptr
import Foreign.C.Types
import Foreign.C.String
import Foreign.ForeignPtr
import Control.Monad
import Control.Monad.ST
import Control.Monad.ST.Unsafe

import Cudd.C
import Cudd.Imperative




data CuddHookType = CuddPreGcHook
                  | CuddPostGcHook
                  | CuddPreReorderingHook
                  | CuddPostReorderingHook
  deriving (Enum,Show,Eq)

{-# LINE 27 "./Cudd/Hook.chs" #-}


type HookTyp = Ptr CDDManager -> CString -> Ptr () -> IO (CInt)
type HookFP  = FunPtr HookTyp

foreign import ccall safe "Cudd_AddHook"
	c_cuddAddHook :: Ptr CDDManager -> HookFP -> CInt -> IO (CInt)

cuddAddHook :: DDManager s u -> HookFP -> CuddHookType -> ST s Int
cuddAddHook (DDManager m) fp typ = unsafeIOToST $ liftM fromIntegral $ c_cuddAddHook m fp (fromIntegral $ fromEnum typ)
	
foreign import ccall safe "Cudd_RemoveHook"
	c_cuddRemoveHook :: Ptr CDDManager -> HookFP -> CInt -> IO (CInt)

cuddRemoveHook :: DDManager s u -> HookFP -> CuddHookType -> ST s Int
cuddRemoveHook (DDManager m) fp typ = unsafeIOToST $ liftM fromIntegral $ c_cuddRemoveHook m fp (fromIntegral $ fromEnum typ)