Skip to content

Commit 32a1a20

Browse files
matthewleonhdgarrood
authored andcommitted
ST.unsafeThaw (purescript#123)
addresses purescript#118
1 parent 21da76e commit 32a1a20

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

src/Data/Array/ST.purs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ module Data.Array.ST
1414
, modifySTArray
1515
, pushAllSTArray
1616
, spliceSTArray
17-
, freeze, thaw
17+
, freeze
18+
, thaw
1819
, unsafeFreeze
20+
, unsafeThaw
1921
, toAssocArray
2022
) where
2123

@@ -66,6 +68,11 @@ withArray f xs = do
6668
unsafeFreeze :: forall a r h. STArray h a -> Eff (st :: ST h | r) (Array a)
6769
unsafeFreeze = pure <<< (unsafeCoerce :: STArray h a -> Array a)
6870

71+
-- | O(1) Convert an immutable array to a mutable array, without copying. The input
72+
-- | array must not be used afterward.
73+
unsafeThaw :: forall a r h. Array a -> Eff (st :: ST h | r) (STArray h a)
74+
unsafeThaw = pure <<< (unsafeCoerce :: Array a -> STArray h a)
75+
6976
-- | Create an empty mutable array.
7077
foreign import emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a)
7178

test/Test/Data/Array/ST.purs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Prelude
44
import Control.Monad.Eff (Eff)
55
import Control.Monad.Eff.Console (log, CONSOLE)
66
import Control.Monad.ST (ST, pureST)
7-
import Data.Array.ST (STArray, emptySTArray, freeze, peekSTArray, pokeSTArray, pushAllSTArray, pushSTArray, spliceSTArray, thaw, toAssocArray, unsafeFreeze)
7+
import Data.Array.ST (STArray, emptySTArray, freeze, peekSTArray, pokeSTArray, pushAllSTArray, pushSTArray, spliceSTArray, thaw, toAssocArray, unsafeThaw, unsafeFreeze)
88
import Data.Foldable (all)
99
import Data.Maybe (Maybe(..), isNothing)
1010
import Test.Assert (assert, ASSERT)
@@ -29,6 +29,10 @@ testArrayST = do
2929
arr <- thaw [1, 2, 3]
3030
freeze arr) == [1, 2, 3]
3131

32+
log "unsafeThaw should produce an STArray from a standard array"
33+
34+
assert $ run (unsafeThaw [1, 2, 3]) == [1, 2, 3]
35+
3236
log "pushSTArray should append a value to the end of the array"
3337

3438
assert $ run (do

0 commit comments

Comments
 (0)