module GHC.ArrBZ where
import GHC.Base
import Control.Monad.STorIO
data Vec a = Vec (Array# a)
data MVec s a = MVec (MutableArray# s a)
allocBoxed :: (STorIO m s, Integral elems) => elems -> a -> m (MVec s a)
unsafeFreezeBoxed :: (STorIO m s) => MVec s a -> m (Vec a)
unsafeThawBoxed :: (STorIO m s) => Vec a -> m (MVec s a)
freezeBoxed :: (STorIO m s) => MVec s a -> Int -> a -> m (Vec a)
thawBoxed :: (STorIO m s) => Vec a -> Int -> a -> m (MVec s a)
allocBoxed elems initial = mLift ( \s ->
case newArray# (fromI# elems) initial s of
(# q, arr #) -> (# q, MVec arr #) )
unsafeFreezeBoxed (MVec mvec) = mLift ( \s ->
case unsafeFreezeArray# mvec s of
(# q, vec #) -> (# q, Vec vec #) )
unsafeThawBoxed (Vec arr#) = mLift ( \s ->
case unsafeThawArray# arr# s of
(# q, marr# #) -> (# q, MVec marr# #))
freezeBoxed (MVec marr#) (I# n#) initial = mLift ( \s1# ->
case newArray# n# initial s1# of { (# s2#, tmparr# #) ->
let copy i# s01# | i# ==# n# = s01#
| otherwise =
case readArray# marr# i# s01# of { (# s02#, e #) ->
case writeArray# tmparr# i# e s02# of { s03# ->
copy (i# +# 1#) s03# }} in
case copy 0# s2# of { s3# ->
case unsafeFreezeArray# tmparr# s3# of { (# s4#, arr# #) ->
(# s4#, Vec arr# #) }}} )
thawBoxed (Vec vec#) (I# n#) initial = mLift ( \s1# ->
case newArray# n# initial s1# of { (# s2#, mvec# #) ->
let copy i# s01# | i# ==# n# = s01#
| otherwise =
case indexArray# vec# i# of { (# e #) ->
case writeArray# mvec# i# e s01# of { s02# ->
copy (i# +# 1#) s02# }} in
case copy 0# s2# of { s3# ->
(# s3#, MVec mvec# #) }} )
fromI# :: (Integral n) => n -> Int#
fromI# n = n# where I# n# = fromIntegral n
readBoxed :: (STorIO m s, Integral index) => MVec s value -> index -> m value
writeBoxed :: (STorIO m s, Integral index) => MVec s value -> index -> value -> m ()
indexBoxed :: (Integral index) => Vec value -> index -> value
readBoxed (MVec vec) index = mLift (readArray# vec (fromI# index))
writeBoxed (MVec vec) index value = mLift ( \s ->
case writeArray# vec (fromI# index) value s of
q -> (# q, () #))
indexBoxed (Vec vec) index =
case indexArray# vec (fromI# index) of { (# s #) -> s }