module Data.Array.IO.Internals (
IOArray(..),
IOUArray(..),
castIOUArray,
) where
import Prelude
import Data.Array.MArray
import Data.Int
import Data.Word
import Data.Typeable
#ifdef __HUGS__
import Hugs.IOArray
#endif
import Control.Monad.ST ( RealWorld, stToIO )
import Foreign.Ptr ( Ptr, FunPtr )
import Foreign.StablePtr ( StablePtr )
import Data.Array.Base
#ifdef __GLASGOW_HASKELL__
import GHC.IOBase
import GHC.Base
#endif /* __GLASGOW_HASKELL__ */
#include "Typeable.h"
INSTANCE_TYPEABLE2(IOArray,iOArrayTc,"IOArray")
instance MArray IOArray e IO where
#if defined(__HUGS__)
getBounds = return . boundsIOArray
getNumElements = return . getNumElementsIOArray
#elif defined(__GLASGOW_HASKELL__)
getBounds (IOArray marr) = stToIO $ getBounds marr
getNumElements (IOArray marr) = stToIO $ getNumElements marr
#endif
newArray = newIOArray
unsafeRead = unsafeReadIOArray
unsafeWrite = unsafeWriteIOArray
newtype IOUArray i e = IOUArray (STUArray RealWorld i e)
INSTANCE_TYPEABLE2(IOUArray,iOUArrayTc,"IOUArray")
instance Eq (IOUArray i e) where
IOUArray s1 == IOUArray s2 = s1 == s2
instance MArray IOUArray Bool IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Char IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Int IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Word IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray (Ptr a) IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray (FunPtr a) IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Float IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Double IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray (StablePtr a) IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Int8 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Int16 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Int32 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Int64 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Word8 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Word16 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Word32 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
instance MArray IOUArray Word64 IO where
getBounds (IOUArray arr) = stToIO $ getBounds arr
getNumElements (IOUArray arr) = stToIO $ getNumElements arr
newArray lu init = stToIO $ do
marr <- newArray lu init; return (IOUArray marr)
unsafeNewArray_ lu = stToIO $ do
marr <- unsafeNewArray_ lu; return (IOUArray marr)
newArray_ = unsafeNewArray_
unsafeRead (IOUArray marr) i = stToIO (unsafeRead marr i)
unsafeWrite (IOUArray marr) i e = stToIO (unsafeWrite marr i e)
castIOUArray :: IOUArray ix a -> IO (IOUArray ix b)
castIOUArray (IOUArray marr) = stToIO $ do
marr' <- castSTUArray marr
return (IOUArray marr')