{-# 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 = forall a b. Storable a => (Ptr a -> IO b) -> IO b alloca \Ptr a p -> forall a. Storable a => Ptr a -> a -> IO () poke Ptr a p a x 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 = forall a. Storable a => Ptr a -> IO a peek