@@ -4,8 +4,12 @@ module Data.Array.ST
4
4
, emptySTArray
5
5
, peekSTArray
6
6
, pokeSTArray
7
+ , pushSTArray
7
8
) where
8
9
10
+ import Data.Maybe
11
+ import Data.Function
12
+
9
13
import Control.Monad.Eff
10
14
import Control.Monad.ST (ST ())
11
15
@@ -21,23 +25,52 @@ foreign import emptySTArray """
21
25
return [];
22
26
}" " " :: forall a h r . Eff (st :: ST h | r ) (STArray h a )
23
27
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
+ }
30
37
};
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 )
32
43
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 {};
42
70
};
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