Skip to content

Commit 8e3ac24

Browse files
committed
Bounds checking, add push method
1 parent 9ed02d0 commit 8e3ac24

File tree

2 files changed

+54
-19
lines changed

2 files changed

+54
-19
lines changed

README.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,11 @@
123123

124124
emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a)
125125

126-
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) a
126+
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
127127

128-
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Unit
128+
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
129+
130+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
129131

130132
runSTArray :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a]
131133

src/Data/Array/ST.purs

+50-17
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ module Data.Array.ST
44
, emptySTArray
55
, peekSTArray
66
, pokeSTArray
7+
, pushSTArray
78
) where
89

10+
import Data.Maybe
11+
import Data.Function
12+
913
import Control.Monad.Eff
1014
import Control.Monad.ST (ST())
1115

@@ -21,23 +25,52 @@ foreign import emptySTArray """
2125
return [];
2226
}""" :: forall a h r. Eff (st :: ST h | r) (STArray h a)
2327

24-
foreign import peekSTArray """
25-
function peekSTArray(arr) {
26-
return function(i) {
27-
return function() {
28-
return arr[i];
29-
};
28+
foreign import peekSTArrayImpl """
29+
function peekSTArrayImpl(arr, i, s, f) {
30+
return function() {
31+
var index = ~~i;
32+
if (0 <= index && index < arr.length) {
33+
return s(arr[index]);
34+
} else {
35+
return f;
36+
}
3037
};
31-
}""" :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) a
38+
}""" :: forall a h e r. Fn4 (STArray h a)
39+
Number
40+
(a -> r)
41+
r
42+
(Eff (st :: ST h | e) r)
3243

33-
foreign import pokeSTArray """
34-
function pokeSTArray(arr) {
35-
return function(i) {
36-
return function(a) {
37-
return function() {
38-
arr[i] = a;
39-
return {};
40-
};
41-
};
44+
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
45+
peekSTArray arr i = runFn4 peekSTArrayImpl arr i Just Nothing
46+
47+
foreign import pokeSTArrayImpl """
48+
function pokeSTArrayImpl(arr, i, a) {
49+
return function() {
50+
var index = ~~i;
51+
if (0 <= index && index <= arr.length) {
52+
arr[index] = a;
53+
return true;
54+
}
55+
return false;
56+
};
57+
}""" :: forall a h e. Fn3 (STArray h a)
58+
Number
59+
a
60+
(Eff (st :: ST h | e) Boolean)
61+
62+
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
63+
pokeSTArray arr i a = runFn3 pokeSTArrayImpl arr i a
64+
65+
foreign import pushSTArrayImpl """
66+
function pushSTArrayImpl(arr, a) {
67+
return function() {
68+
arr.push(a);
69+
return {};
4270
};
43-
}""" :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Unit
71+
}""" :: forall a h e. Fn2 (STArray h a)
72+
a
73+
(Eff (st :: ST h | e) Unit)
74+
75+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
76+
pushSTArray arr a = runFn2 pushSTArrayImpl arr a

0 commit comments

Comments
 (0)