{-# 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