module NHC.FFI ( Ptr -- abstract, instance of: Eq, Ord, Enum, Show , nullPtr -- :: Ptr a , castPtr -- :: Ptr a -> Ptr b , plusPtr -- :: Ptr a -> Int -> Ptr b , alignPtr -- :: Ptr a -> Int -> Ptr a , minusPtr -- :: Ptr a -> Ptr b -> Int ) where {- import Addr newtype Ptr a = Ptr Addr deriving (Eq,Ord,Show) instance Enum (Ptr a) where toEnum a = Ptr (toEnum a) fromEnum (Ptr a) = fromEnum a nullPtr :: Ptr a nullPtr = Ptr nullAddr castPtr :: Ptr a -> Ptr b castPtr (Ptr a) = Ptr a plusPtr :: Ptr a -> Int -> Ptr b plusPtr (Ptr a) i = Ptr (plusAddr a i) alignPtr :: Ptr a -> Int -> Ptr a alignPtr (Ptr a) i = Ptr (intToAddr (let j = addrToInt a in j + (j`rem`i))) minusPtr :: Ptr a -> Ptr b -> Int minusPtr (Ptr a) (Ptr b) = addrToInt a - addrToInt b -} import Numeric (showHex) data Ptr a; -- primitive type known to compiler internals foreign import cast ptrToInt :: Ptr a -> Int foreign import cast intToPtr :: Int -> Ptr a foreign import cast castPtr :: Ptr a -> Ptr b instance Eq (Ptr a) where x == y = ptrToInt x == ptrToInt y instance Ord (Ptr a) where compare x y = compare (ptrToInt x) (ptrToInt y) instance Show (Ptr a) where showsPrec p a = showString "0x" . showHex (ptrToInt a) instance Enum (Ptr a) where toEnum = intToPtr fromEnum = ptrToInt nullPtr :: Ptr a nullPtr = intToPtr 0 plusPtr :: Ptr a -> Int -> Ptr b plusPtr a i = intToPtr (ptrToInt a + i) alignPtr :: Ptr a -> Int -> Ptr a alignPtr a i = intToPtr (let j = ptrToInt a in j + (j`rem`i)) minusPtr :: Ptr a -> Ptr b -> Int minusPtr a b = ptrToInt a - ptrToInt b