module Bindings.Utilities (

    GlobalVariable, setGlobalVariable, getGlobalVariable,
    Callback(..)

  ) where

import Foreign
import Foreign.C
import Data.Int

newtype (Storable a) => GlobalVariable a = GlobalVariable (Ptr a)

setGlobalVariable :: (Storable a) => GlobalVariable a -> a -> IO ()
setGlobalVariable (GlobalVariable p) v = poke p v

getGlobalVariable :: (Storable a) => GlobalVariable a -> IO a
getGlobalVariable (GlobalVariable p) = peek p

class (Storable cb) => Callback cb where
    type F cb :: *
    nullCallback :: cb
    makeCallback :: F cb -> IO cb
    freeCallback :: cb -> IO ()
    withCallback :: F cb -> (cb -> IO a) -> IO a
    withCallback f c = do
        made <- makeCallback f
        result <- c made
        freeCallback made
        return result