@@ -235,21 +235,16 @@ primArrayFromList vs = primArrayFromListN (L.length vs) vs
235
235
-- | Create a 'PrimArray' from a list of a known length. If the length
236
236
-- of the list does not match the given length, this throws an exception.
237
237
primArrayFromListN :: forall a . Prim a => Int -> [a ] -> PrimArray a
238
- primArrayFromListN len vs = runST run where
239
- run :: forall s . ST s (PrimArray a )
240
- run = do
241
- arr <- newPrimArray len
242
- let go :: [a ] -> Int -> ST s ()
243
- go [] ! ix = if ix == len
244
- then return ()
245
- else die " fromListN" " list length less than specified size"
246
- go (a : as) ! ix = if ix < len
247
- then do
248
- writePrimArray arr ix a
249
- go as (ix + 1 )
250
- else die " fromListN" " list length greater than specified size"
251
- go vs 0
252
- unsafeFreezePrimArray arr
238
+ primArrayFromListN len vs = createPrimArray len $ \ arr ->
239
+ let go [] ! ix = if ix == len
240
+ then return ()
241
+ else die " fromListN" " list length less than specified size"
242
+ go (a : as) ! ix = if ix < len
243
+ then do
244
+ writePrimArray arr ix a
245
+ go as (ix + 1 )
246
+ else die " fromListN" " list length greater than specified size"
247
+ in go vs 0
253
248
254
249
-- | Convert a 'PrimArray' to a list.
255
250
{-# INLINE primArrayToList #-}
@@ -769,31 +764,29 @@ mapPrimArray :: (Prim a, Prim b)
769
764
=> (a -> b )
770
765
-> PrimArray a
771
766
-> PrimArray b
772
- mapPrimArray f arr = runST $ do
773
- let ! sz = sizeofPrimArray arr
774
- marr <- newPrimArray sz
767
+ mapPrimArray f arr = createPrimArray sz $ \ marr ->
775
768
let go ! ix = when (ix < sz) $ do
776
769
let b = f (indexPrimArray arr ix)
777
770
writePrimArray marr ix b
778
771
go (ix + 1 )
779
- go 0
780
- unsafeFreezePrimArray marr
772
+ in go 0
773
+ where
774
+ ! sz = sizeofPrimArray arr
781
775
782
776
-- | Indexed map over the elements of a primitive array.
783
777
{-# INLINE imapPrimArray #-}
784
778
imapPrimArray :: (Prim a , Prim b )
785
779
=> (Int -> a -> b )
786
780
-> PrimArray a
787
781
-> PrimArray b
788
- imapPrimArray f arr = runST $ do
789
- let ! sz = sizeofPrimArray arr
790
- marr <- newPrimArray sz
782
+ imapPrimArray f arr = createPrimArray sz $ \ marr ->
791
783
let go ! ix = when (ix < sz) $ do
792
784
let b = f ix (indexPrimArray arr ix)
793
785
writePrimArray marr ix b
794
786
go (ix + 1 )
795
- go 0
796
- unsafeFreezePrimArray marr
787
+ in go 0
788
+ where
789
+ ! sz = sizeofPrimArray arr
797
790
798
791
-- | Filter elements of a primitive array according to a predicate.
799
792
{-# INLINE filterPrimArray #-}
@@ -963,13 +956,11 @@ generatePrimArray :: Prim a
963
956
=> Int -- ^ length
964
957
-> (Int -> a ) -- ^ element from index
965
958
-> PrimArray a
966
- generatePrimArray len f = runST $ do
967
- marr <- newPrimArray len
959
+ generatePrimArray len f = createPrimArray len $ \ marr ->
968
960
let go ! ix = when (ix < len) $ do
969
961
writePrimArray marr ix (f ix)
970
962
go (ix + 1 )
971
- go 0
972
- unsafeFreezePrimArray marr
963
+ in go 0
973
964
974
965
-- | Create a primitive array by copying the element the given
975
966
-- number of times.
@@ -978,10 +969,8 @@ replicatePrimArray :: Prim a
978
969
=> Int -- ^ length
979
970
-> a -- ^ element
980
971
-> PrimArray a
981
- replicatePrimArray len a = runST $ do
982
- marr <- newPrimArray len
972
+ replicatePrimArray len a = createPrimArray len $ \ marr ->
983
973
setPrimArray marr 0 len a
984
- unsafeFreezePrimArray marr
985
974
986
975
-- | Generate a primitive array by evaluating the applicative generator
987
976
-- function at each index.
@@ -1129,10 +1118,8 @@ clonePrimArray :: Prim a
1129
1118
-> Int -- ^ number of elements to copy
1130
1119
-> PrimArray a
1131
1120
{-# INLINE clonePrimArray #-}
1132
- clonePrimArray src off n = runPrimArray $ do
1133
- dst <- newPrimArray n
1121
+ clonePrimArray src off n = createPrimArray n $ \ dst ->
1134
1122
copyPrimArray dst 0 src off n
1135
- return dst
1136
1123
1137
1124
-- | Return a newly allocated mutable array with the specified subrange of
1138
1125
-- the provided mutable array. The provided mutable array should contain the
0 commit comments