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