{-# LANGUAGE CPP, FlexibleContexts, ForeignFunctionInterface, MagicHash, Rank2Types, UnliftedFFITypes #-} module Data.BloomFilter.Array (newArray) where import Control.Monad.ST (ST) import Control.Monad.ST.Unsafe (unsafeIOToST) import Data.Array.Base (MArray, STUArray(..), unsafeNewArray_) #if __GLASGOW_HASKELL__ >= 704 import Foreign.C.Types (CInt(..), CSize(..)) #else import Foreign.C.Types (CInt, CSize) #endif import Foreign.Ptr (Ptr) import GHC.Base (MutableByteArray#) newArray :: forall e s. (MArray (STUArray s) e (ST s)) => Int -> Int -> ST s (STUArray s Int e) {-# INLINE newArray #-} newArray :: forall e s. MArray (STUArray s) e (ST s) => Int -> Int -> ST s (STUArray s Int e) newArray Int numElems Int numBytes = do ary :: STUArray s Int e ary@(STUArray Int _ Int _ Int _ MutableByteArray# s marr#) <- forall (a :: * -> * -> *) e (m :: * -> *) i. (MArray a e m, Ix i) => (i, i) -> m (a i e) unsafeNewArray_ (Int 0, Int numElems forall a. Num a => a -> a -> a - Int 1) Ptr Any _ <- forall a s. IO a -> ST s a unsafeIOToST (forall s a. MutableByteArray# s -> CInt -> CSize -> IO (Ptr a) memset MutableByteArray# s marr# CInt 0 (forall a b. (Integral a, Num b) => a -> b fromIntegral Int numBytes)) forall (m :: * -> *) a. Monad m => a -> m a return STUArray s Int e ary foreign import ccall unsafe "memset" memset :: MutableByteArray# s -> CInt -> CSize -> IO (Ptr a)