{-# LANGUAGE Unsafe #-}
{-# LANGUAGE NoImplicitPrelude, RoleAnnotations #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
{-# OPTIONS_HADDOCK not-home #-}
module GHC.IOArray (
IOArray(..),
newIOArray, unsafeReadIOArray, unsafeWriteIOArray,
readIOArray, writeIOArray,
boundsIOArray
) where
import GHC.Base
import GHC.IO
import GHC.Arr
newtype IOArray i e = IOArray (STArray RealWorld i e)
type role IOArray nominal representational
instance Eq (IOArray i e) where
IOArray STArray RealWorld i e
x == :: IOArray i e -> IOArray i e -> Bool
== IOArray STArray RealWorld i e
y = STArray RealWorld i e
x STArray RealWorld i e -> STArray RealWorld i e -> Bool
forall a. Eq a => a -> a -> Bool
== STArray RealWorld i e
y
newIOArray :: Ix i => (i,i) -> e -> IO (IOArray i e)
{-# INLINE newIOArray #-}
newIOArray :: forall i e. Ix i => (i, i) -> e -> IO (IOArray i e)
newIOArray (i, i)
lu e
initial = ST RealWorld (IOArray i e) -> IO (IOArray i e)
forall a. ST RealWorld a -> IO a
stToIO (ST RealWorld (IOArray i e) -> IO (IOArray i e))
-> ST RealWorld (IOArray i e) -> IO (IOArray i e)
forall a b. (a -> b) -> a -> b
$ do {STArray RealWorld i e
marr <- (i, i) -> e -> ST RealWorld (STArray RealWorld i e)
forall i e s. Ix i => (i, i) -> e -> ST s (STArray s i e)
newSTArray (i, i)
lu e
initial; IOArray i e -> ST RealWorld (IOArray i e)
forall a. a -> ST RealWorld a
forall (m :: * -> *) a. Monad m => a -> m a
return (STArray RealWorld i e -> IOArray i e
forall i e. STArray RealWorld i e -> IOArray i e
IOArray STArray RealWorld i e
marr)}
unsafeReadIOArray :: IOArray i e -> Int -> IO e
{-# INLINE unsafeReadIOArray #-}
unsafeReadIOArray :: forall i e. IOArray i e -> Int -> IO e
unsafeReadIOArray (IOArray STArray RealWorld i e
marr) Int
i = ST RealWorld e -> IO e
forall a. ST RealWorld a -> IO a
stToIO (STArray RealWorld i e -> Int -> ST RealWorld e
forall s i e. STArray s i e -> Int -> ST s e
unsafeReadSTArray STArray RealWorld i e
marr Int
i)
unsafeWriteIOArray :: IOArray i e -> Int -> e -> IO ()
{-# INLINE unsafeWriteIOArray #-}
unsafeWriteIOArray :: forall i e. IOArray i e -> Int -> e -> IO ()
unsafeWriteIOArray (IOArray STArray RealWorld i e
marr) Int
i e
e = ST RealWorld () -> IO ()
forall a. ST RealWorld a -> IO a
stToIO (STArray RealWorld i e -> Int -> e -> ST RealWorld ()
forall s i e. STArray s i e -> Int -> e -> ST s ()
unsafeWriteSTArray STArray RealWorld i e
marr Int
i e
e)
readIOArray :: Ix i => IOArray i e -> i -> IO e
readIOArray :: forall i e. Ix i => IOArray i e -> i -> IO e
readIOArray (IOArray STArray RealWorld i e
marr) i
i = ST RealWorld e -> IO e
forall a. ST RealWorld a -> IO a
stToIO (STArray RealWorld i e -> i -> ST RealWorld e
forall i s e. Ix i => STArray s i e -> i -> ST s e
readSTArray STArray RealWorld i e
marr i
i)
writeIOArray :: Ix i => IOArray i e -> i -> e -> IO ()
writeIOArray :: forall i e. Ix i => IOArray i e -> i -> e -> IO ()
writeIOArray (IOArray STArray RealWorld i e
marr) i
i e
e = ST RealWorld () -> IO ()
forall a. ST RealWorld a -> IO a
stToIO (STArray RealWorld i e -> i -> e -> ST RealWorld ()
forall i s e. Ix i => STArray s i e -> i -> e -> ST s ()
writeSTArray STArray RealWorld i e
marr i
i e
e)
{-# INLINE boundsIOArray #-}
boundsIOArray :: IOArray i e -> (i,i)
boundsIOArray :: forall i e. IOArray i e -> (i, i)
boundsIOArray (IOArray STArray RealWorld i e
marr) = STArray RealWorld i e -> (i, i)
forall s i e. STArray s i e -> (i, i)
boundsSTArray STArray RealWorld i e
marr