module FFI where
import Foreign (Ptr, Storable(peek), castPtr, with, alloca)
import Foreign.C (CFloat(CFloat), CDouble(CDouble))
toCEnum :: (Enum a, Num b) => a -> b
toCEnum = fromIntegral . fromEnum
fromCEnum :: (Integral a, Enum b) => a -> b
fromCEnum = toEnum . fromIntegral
fromCFloat :: CFloat -> Float
fromCFloat (CFloat x) = x
fromCDouble :: CDouble -> Double
fromCDouble (CDouble x) = x
withVoidPtr :: Storable a => a -> (Ptr () -> IO c) -> IO c
withVoidPtr x f = with x (f . castPtr)
getReturnValue :: Storable a => (Ptr a -> IO ()) -> IO a
getReturnValue f = alloca $ \ x -> f x >> peek x