module Hapstone.Internal.Util where
import Foreign
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr
import System.IO.Unsafe (unsafePerformIO)
peekNum :: (Integral a, Num b, Storable a) => Ptr a -> IO b
peekNum a = fromIntegral <$> peek a
getCULongFromEnum :: Enum e => e -> CULong
getCULongFromEnum = fromIntegral . fromEnum
withCast :: Storable a => a -> (Ptr b -> IO c) -> IO c
withCast a f = with a (f . castPtr)
combine :: (Enum e, Num n, Bits n) => [e] -> n
combine = foldr ((.|.) <$> fromIntegral . fromEnum) 0
stringLookup :: CString -> Maybe String
stringLookup s
| s == nullPtr = Nothing
| otherwise = Just . unsafePerformIO $ peekCString s
fromZero :: (Eq a, Num a) => a -> Maybe a
fromZero 0 = Nothing
fromZero v = Just v
peekFunMaybe :: Storable a => (Ptr a -> IO a) -> Ptr a -> IO (Maybe a)
peekFunMaybe peekFun ptr
| ptr == nullPtr = return Nothing
| otherwise = Just <$> peekFun ptr