\begin{code}
module ByteArray
(
- ByteArray(..), -- not abstract, for now.
+ ByteArray(..), -- not abstract, for now. Instance of : CCallable, Eq.
Ix,
+ newByteArray, -- :: Ix ix => (ix,ix) -> ST s (ByteArray ix)
+
--Indexing of ordinary @Arrays@ is standard Haskell and isn't defined here.
- indexCharArray, --:: Ix ix => ByteArray ix -> ix -> Char
- indexIntArray, --:: Ix ix => ByteArray ix -> ix -> Int
- indexWordArray, --:: Ix ix => ByteArray ix -> ix -> Word
- indexAddrArray, --:: Ix ix => ByteArray ix -> ix -> Addr
- indexFloatArray, --:: Ix ix => ByteArray ix -> ix -> Float
- indexDoubleArray, --:: Ix ix => ByteArray ix -> ix -> Double
+ indexCharArray, -- :: Ix ix => ByteArray ix -> ix -> Char
+ indexIntArray, -- :: Ix ix => ByteArray ix -> ix -> Int
+ indexWordArray, -- :: Ix ix => ByteArray ix -> ix -> Word
+ indexAddrArray, -- :: Ix ix => ByteArray ix -> ix -> Addr
+ indexFloatArray, -- :: Ix ix => ByteArray ix -> ix -> Float
+ indexDoubleArray, -- :: Ix ix => ByteArray ix -> ix -> Double
+ indexStablePtrArray, -- :: Ix ix => ByteArray ix -> ix -> (StablePtr a)
+ sizeofByteArray, -- :: Ix ix => ByteArray ix -> Int
+ boundsOfByteArray -- :: Ix ix => ByteArray ix -> (ix, ix)
+
) where
import PrelArr
+import PrelBase
+import PrelStable( StablePtr(..) )
+import PrelST
import Ix
\end{code}
+\begin{code}
+indexStablePtrArray :: Ix ix => ByteArray ix -> ix -> (StablePtr a)
+indexStablePtrArray (ByteArray ixs barr#) n
+ = case (index ixs n) of { I# n# ->
+ case indexStablePtrArray# barr# n# of { r# ->
+ (StablePtr r#)}}
+\end{code}
+
+The size returned is in bytes.
+
+\begin{code}
+sizeofByteArray :: Ix ix => ByteArray ix -> Int
+sizeofByteArray (ByteArray _ arr#) =
+ case (sizeofByteArray# arr#) of
+ i# -> (I# i#)
+
+boundsOfByteArray :: Ix ix => ByteArray ix -> (ix, ix)
+boundsOfByteArray (ByteArray ixs _) = ixs
+\end{code}
+
+\begin{code}
+newByteArray :: Ix ix => (ix,ix) -> ST s (ByteArray ix)
+newByteArray ixs = do
+ m_arr <- newCharArray ixs
+ unsafeFreezeByteArray m_arr
+\end{code}
+
+If it should turn out to be an issue, could probably be speeded
+up quite a bit.
+
+\begin{code}
+instance Ix ix => Eq (ByteArray ix) where
+ b1 == b2 = eqByteArray b1 b2
+
+eqByteArray :: Ix ix => ByteArray ix -> ByteArray ix -> Bool
+eqByteArray b1 b2 =
+ sizeofByteArray b1 == sizeofByteArray b2 &&
+ all (\ x -> indexCharArray b1 x == indexCharArray b2 x) (range (boundsOfByteArray b1))
+\end{code}