{-# LANGUAGE CPP, DeriveDataTypeable, MagicHash, UnboxedTuples #-}
{- |
Copyright   :  (c) Andy Sonnenburg 2013
License     :  BSD3
Maintainer  :  andy22286@gmail.com
-}
module Data.Prim.Array
       ( MutableArray
       , newArray
       , readArray
       , writeArray
       ) where

import Control.Monad.Prim

import Data.Typeable (Typeable)

import GHC.Exts

data MutableArray s a = MutableArray (MutableArray# s a) deriving Typeable

instance Eq (MutableArray s a) where
  MutableArray a == MutableArray b = sameMutableArray# a b
  {-# INLINE (==) #-}

newArray :: Int -> a -> Prim s (MutableArray s a)
newArray (I# i) a = prim $ \ s -> case newArray# i a s of
  (# s', array #) -> (# s', MutableArray array #)
{-# INLINE newArray #-}

readArray :: MutableArray s a -> Int -> Prim s a
readArray (MutableArray array) (I# i) = prim $ readArray# array i
{-# INLINE readArray #-}

writeArray :: MutableArray s a -> Int -> a -> Prim s ()
writeArray (MutableArray array) (I# i) a =
  prim $ \ s -> case writeArray# array i a s of
    s' -> (# s', () #)
{-# INLINE writeArray #-}