module System.WLC.Utilities(checkPtr, getPtrValue, apply3, Primitive(..)) where
import Foreign.Ptr (Ptr, nullPtr)
import Foreign.Storable (Storable, peek)
class Primitive a b where
fromPrimitive :: a -> b
toPrimitive :: b -> a
fromPrimitivePtr :: (Storable a) => Ptr a -> IO (Maybe b)
fromPrimitivePtr ptr = fmap fromPrimitive <$> getPtrValue ptr
checkPtr :: Ptr a -> Maybe (Ptr a)
checkPtr ptr = if ptr /= nullPtr then Just ptr else Nothing
getPtrValue :: (Storable a) => Ptr a -> IO (Maybe a)
getPtrValue ptr = sequence $ fmap peek (checkPtr ptr)
apply3 :: (e -> a) -> (f -> b) -> (g -> c) -> (a -> b -> c -> d) -> (e -> f -> g -> d)
apply3 a1 a2 a3 fn e f g = fn (a1 e) (a2 f) (a3 g)