{-# 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#) <- (Int, Int) -> ST s (STUArray s Int e)
forall (a :: * -> * -> *) e (m :: * -> *) i.
(MArray a e m, Ix i) =>
(i, i) -> m (a i e)
unsafeNewArray_ (Int
0, Int
numElems Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
  Ptr Any
_ <- IO (Ptr Any) -> ST s (Ptr Any)
forall a s. IO a -> ST s a
unsafeIOToST (MutableByteArray# s -> CInt -> CSize -> IO (Ptr Any)
forall s a. MutableByteArray# s -> CInt -> CSize -> IO (Ptr a)
memset MutableByteArray# s
marr# CInt
0 (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
numBytes))
  STUArray s Int e -> ST s (STUArray s Int e)
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)