{-# LANGUAGE BlockArguments #-} {-# LANGUAGE FlexibleInstances, UndecidableInstances #-} {-# OPTIONS_GHC -Wall -fno-warn-tabs #-} module System.GLib.Pointerable (Pointerable(..)) where import Foreign.Ptr import Foreign.Marshal import Foreign.Storable class Pointerable a where withPtr :: a -> (Ptr a -> IO b) -> IO b; fromPtr :: Ptr a -> IO a instance {-# OVERLAPPABLE #-} Storable a => Pointerable a where withPtr :: forall b. a -> (Ptr a -> IO b) -> IO b withPtr a x Ptr a -> IO b f = (Ptr a -> IO b) -> IO b forall a b. Storable a => (Ptr a -> IO b) -> IO b alloca \Ptr a p -> Ptr a -> a -> IO () forall a. Storable a => Ptr a -> a -> IO () poke Ptr a p a x IO () -> IO b -> IO b forall a b. IO a -> IO b -> IO b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Ptr a -> IO b f Ptr a p fromPtr :: Ptr a -> IO a fromPtr = Ptr a -> IO a forall a. Storable a => Ptr a -> IO a peek