module GHC.Data.SmallArray
( SmallMutableArray (..)
, SmallArray (..)
, newSmallArray
, writeSmallArray
, freezeSmallArray
, unsafeFreezeSmallArray
, indexSmallArray
, listToArray
)
where
import GHC.Exts
import GHC.Prelude
import GHC.ST
data SmallArray a = SmallArray (SmallArray# a)
data SmallMutableArray s a = SmallMutableArray (SmallMutableArray# s a)
newSmallArray
:: Int
-> a
-> State# s
-> (# State# s, SmallMutableArray s a #)
newSmallArray (I# sz) x s = case newSmallArray# sz x s of
(# s', a #) -> (# s', SmallMutableArray a #)
writeSmallArray
:: SmallMutableArray s a
-> Int
-> a
-> State# s
-> State# s
writeSmallArray (SmallMutableArray a) (I# i) x = writeSmallArray# a i x
freezeSmallArray
:: SmallMutableArray s a
-> Int
-> Int
-> State# s
-> (# State# s, SmallArray a #)
freezeSmallArray (SmallMutableArray ma) (I# offset) (I# len) s =
case freezeSmallArray# ma offset len s of
(# s', a #) -> (# s', SmallArray a #)
unsafeFreezeSmallArray
:: SmallMutableArray s a
-> State# s
-> (# State# s, SmallArray a #)
unsafeFreezeSmallArray (SmallMutableArray ma) s =
case unsafeFreezeSmallArray# ma s of
(# s', a #) -> (# s', SmallArray a #)
indexSmallArray
:: SmallArray a
-> Int
-> a
indexSmallArray (SmallArray sa#) (I# i) = case indexSmallArray# sa# i of
(# v #) -> v
listToArray :: Int -> (e -> Int) -> (e -> a) -> [e] -> SmallArray a
listToArray (I# size) index_of value_of xs = runST $ ST \s ->
let
index_of' e = case index_of e of I# i -> i
write_elems ma es s = case es of
[] -> s
e:es' -> case writeSmallArray# ma (index_of' e) (value_of e) s of
s' -> write_elems ma es' s'
in
case newSmallArray# size undefined s of
(# s', ma #) -> case write_elems ma xs s' of
s'' -> case unsafeFreezeSmallArray# ma s'' of
(# s''', a #) -> (# s''', SmallArray a #)