module Hercules.CNix.Memory
(
Delete (..),
withDelete,
Finalizer (..),
toForeignPtr,
forNonNull,
traverseNonNull,
)
where
import Foreign (FinalizerPtr, ForeignPtr, newForeignPtr, nullPtr)
import Protolude
class Delete a where
delete :: Ptr a -> IO ()
withDelete :: (Delete a) => IO (Ptr a) -> (Ptr a -> IO b) -> IO b
withDelete :: forall a b. Delete a => IO (Ptr a) -> (Ptr a -> IO b) -> IO b
withDelete IO (Ptr a)
make = IO (Ptr a) -> (Ptr a -> IO ()) -> (Ptr a -> IO b) -> IO b
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket IO (Ptr a)
make Ptr a -> IO ()
forall a. Delete a => Ptr a -> IO ()
delete
class Finalizer a where
finalizer :: FinalizerPtr a
toForeignPtr :: (Finalizer a) => Ptr a -> IO (ForeignPtr a)
toForeignPtr :: forall a. Finalizer a => Ptr a -> IO (ForeignPtr a)
toForeignPtr Ptr a
ptr = FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr a
forall a. Finalizer a => FinalizerPtr a
finalizer Ptr a
ptr
traverseNonNull :: (Applicative m) => (Ptr a -> m b) -> Ptr a -> m (Maybe b)
traverseNonNull :: forall (m :: * -> *) a b.
Applicative m =>
(Ptr a -> m b) -> Ptr a -> m (Maybe b)
traverseNonNull Ptr a -> m b
f Ptr a
p = if Ptr a
p Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr a
forall a. Ptr a
nullPtr then Maybe b -> m (Maybe b)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe b
forall a. Maybe a
Nothing else b -> Maybe b
forall a. a -> Maybe a
Just (b -> Maybe b) -> m b -> m (Maybe b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr a -> m b
f Ptr a
p
forNonNull :: (Applicative m) => Ptr a -> (Ptr a -> m b) -> m (Maybe b)
forNonNull :: forall (m :: * -> *) a b.
Applicative m =>
Ptr a -> (Ptr a -> m b) -> m (Maybe b)
forNonNull = ((Ptr a -> m b) -> Ptr a -> m (Maybe b))
-> Ptr a -> (Ptr a -> m b) -> m (Maybe b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Ptr a -> m b) -> Ptr a -> m (Maybe b)
forall (m :: * -> *) a b.
Applicative m =>
(Ptr a -> m b) -> Ptr a -> m (Maybe b)
traverseNonNull