module Bindings.Utilities where
import Foreign.C
import Foreign
import Data.Int

newtype (Storable a) => GlobalVar a = GlobalVar (Ptr a)
setGlobalVar(GlobalVar p) v = poke p v
getGlobalVar (GlobalVar p) = peek p

class Callback f where
  makeCallback :: f -> IO (FunPtr f)
  freeCallback :: FunPtr f -> IO ()
  withCallback :: f -> (FunPtr f -> IO a) -> IO a
  freeCallback = freeHaskellFunPtr
  withCallback fun action = do
    funPtr <- makeCallback fun
    result <- action funPtr
    freeHaskellFunPtr funPtr
    return result

type CallbackMaker a = a -> IO (FunPtr a)

type CB0001 a = Ptr a -> CInt -> Ptr CString -> Ptr CString -> IO CInt
foreign import ccall "wrapper" mkCB0001 :: CallbackMaker (CB0001 a)
instance Callback (CB0001 a) where
  makeCallback = mkCB0001

type CB0002 = Ptr () -> Ptr () -> IO CInt
foreign import ccall "wrapper" mkCB0002 :: CallbackMaker CB0002
instance Callback CB0002 where
  makeCallback = mkCB0002

type CB0003 a = Ptr a -> CInt -> IO CInt
foreign import ccall "wrapper" mkCB0003 :: CallbackMaker (CB0003 a)
instance Callback (CB0003 a) where
  makeCallback = mkCB0003

type CB0004 a b = Ptr a -> Ptr b -> CInt -> CString -> IO ()
foreign import ccall "wrapper" mkCB0004 :: CallbackMaker (CB0004 a b)
instance Callback (CB0004 a b) where
  makeCallback = mkCB0004

type CB0005 a = Ptr a -> IO CInt
foreign import ccall "wrapper" mkCB0005 :: CallbackMaker (CB0005 a)
instance Callback (CB0005 a) where
  makeCallback = mkCB0005

type CB0006 a = Ptr a -> CInt -> CString -> CInt -> CString -> IO CInt
foreign import ccall "wrapper" mkCB0006 :: CallbackMaker (CB0006 a)
instance Callback (CB0006 a) where
  makeCallback = mkCB0006

type CB0007 a b = Ptr a -> CInt -> Ptr (Ptr b) -> IO ()
foreign import ccall "wrapper" mkCB0007 :: CallbackMaker (CB0007 a b)
instance Callback (CB0007 a b) where
  makeCallback = mkCB0007

type CB0008 a = Ptr a -> IO ()
foreign import ccall "wrapper" mkCB0008 :: CallbackMaker (CB0008 a)
instance Callback (CB0008 a) where
  makeCallback = mkCB0008

type CB0009 a = Ptr a -> CInt -> CString -> CString ->
      CString -> CString -> IO CInt
foreign import ccall "wrapper" mkCB0009 :: CallbackMaker (CB0009 a)
instance Callback (CB0009 a) where
  makeCallback = mkCB0009

type CB000A a = Ptr a -> CInt -> CString -> CString ->
      Data.Int.Int64 -> IO ()
foreign import ccall "wrapper" mkCB000A :: CallbackMaker (CB000A a)
instance Callback (CB000A a) where
  makeCallback = mkCB000A

type CB000B = CInt -> IO ()
foreign import ccall "wrapper" mkCB000B :: CallbackMaker CB000B
instance Callback CB000B where
  makeCallback = mkCB000B

type CB000C = IO ()
foreign import ccall "wrapper" mkCB000C :: CallbackMaker CB000C
instance Callback CB000C where
  makeCallback = mkCB000C