{-# LANGUAGE MagicHash, UnboxedTuples #-}
module Fleet.Array.MutArray where

import GHC.Exts
import GHC.Base

data MutArray a = MA (MutableArray# RealWorld a)

newMutArray :: Int -> a -> IO (MutArray a)
newMutArray :: forall a. Int -> a -> IO (MutArray a)
newMutArray (I# Int#
n) a
x = (State# RealWorld -> (# State# RealWorld, MutArray a #))
-> IO (MutArray a)
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, MutArray a #))
 -> IO (MutArray a))
-> (State# RealWorld -> (# State# RealWorld, MutArray a #))
-> IO (MutArray a)
forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
  case Int#
-> a
-> State# RealWorld
-> (# State# RealWorld, MutableArray# RealWorld a #)
forall a d.
Int# -> a -> State# d -> (# State# d, MutableArray# d a #)
newArray# Int#
n a
x State# RealWorld
s of
    (# State# RealWorld
s', MutableArray# RealWorld a
arr #) -> (# State# RealWorld
s', MutableArray# RealWorld a -> MutArray a
forall a. MutableArray# RealWorld a -> MutArray a
MA MutableArray# RealWorld a
arr #)

readMutArray :: MutArray a -> Int -> IO a
readMutArray :: forall a. MutArray a -> Int -> IO a
readMutArray (MA MutableArray# RealWorld a
arr) (I# Int#
i) = (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (MutableArray# RealWorld a
-> Int# -> State# RealWorld -> (# State# RealWorld, a #)
forall d a.
MutableArray# d a -> Int# -> State# d -> (# State# d, a #)
readArray# MutableArray# RealWorld a
arr Int#
i)

writeMutArray :: MutArray a -> Int -> a -> IO ()
writeMutArray :: forall a. MutArray a -> Int -> a -> IO ()
writeMutArray (MA MutableArray# RealWorld a
arr) (I# Int#
i) a
x = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO (\State# RealWorld
s -> (# MutableArray# RealWorld a
-> Int# -> a -> State# RealWorld -> State# RealWorld
forall d a. MutableArray# d a -> Int# -> a -> State# d -> State# d
writeArray# MutableArray# RealWorld a
arr Int#
i a
x State# RealWorld
s, () #))

cloneMutArray :: MutArray a -> Int -> Int -> IO (MutArray a)
cloneMutArray :: forall a. MutArray a -> Int -> Int -> IO (MutArray a)
cloneMutArray (MA MutableArray# RealWorld a
arr) (I# Int#
off) (I# Int#
len) = (State# RealWorld -> (# State# RealWorld, MutArray a #))
-> IO (MutArray a)
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, MutArray a #))
 -> IO (MutArray a))
-> (State# RealWorld -> (# State# RealWorld, MutArray a #))
-> IO (MutArray a)
forall a b. (a -> b) -> a -> b
$ \State# RealWorld
s ->
  case MutableArray# RealWorld a
-> Int#
-> Int#
-> State# RealWorld
-> (# State# RealWorld, MutableArray# RealWorld a #)
forall d a.
MutableArray# d a
-> Int# -> Int# -> State# d -> (# State# d, MutableArray# d a #)
cloneMutableArray# MutableArray# RealWorld a
arr Int#
off Int#
len State# RealWorld
s of
    (# State# RealWorld
s', MutableArray# RealWorld a
arr' #) -> (# State# RealWorld
s', MutableArray# RealWorld a -> MutArray a
forall a. MutableArray# RealWorld a -> MutArray a
MA MutableArray# RealWorld a
arr' #)

sizeofMutArray :: MutArray a -> Int
sizeofMutArray :: forall a. MutArray a -> Int
sizeofMutArray (MA MutableArray# RealWorld a
x) = Int# -> Int
I# (MutableArray# RealWorld a -> Int#
forall d a. MutableArray# d a -> Int#
sizeofMutableArray# MutableArray# RealWorld a
x)