1
- module Data.Array.ST
1
+ module Data.Array.ST
2
2
( STArray (..)
3
+ , Assoc ()
3
4
, runSTArray
4
5
, emptySTArray
5
6
, peekSTArray
6
- , pokeSTArray
7
- , pushSTArray
7
+ , pokeSTArray
8
+ , pushSTArray
9
+ , pushAllSTArray
10
+ , spliceSTArray
11
+ , freeze , thaw
12
+ , toAssocArray
8
13
) where
9
14
10
15
import Data.Maybe
@@ -15,6 +20,8 @@ import Control.Monad.ST (ST())
15
20
16
21
foreign import data STArray :: * -> * -> *
17
22
23
+ type Assoc a = { value :: a , index :: Number }
24
+
18
25
foreign import runSTArray " " "
19
26
function runSTArray(f) {
20
27
return f;
@@ -24,7 +31,7 @@ foreign import emptySTArray """
24
31
function emptySTArray() {
25
32
return [];
26
33
}" " " :: forall a h r . Eff (st :: ST h | r ) (STArray h a )
27
-
34
+
28
35
foreign import peekSTArrayImpl " " "
29
36
function peekSTArrayImpl(arr, i, s, f) {
30
37
return function() {
@@ -35,12 +42,12 @@ foreign import peekSTArrayImpl """
35
42
return f;
36
43
}
37
44
};
38
- }" " " :: forall a h e r . Fn4 (STArray h a )
39
- Number
45
+ }" " " :: forall a h e r . Fn4 (STArray h a )
46
+ Number
40
47
(a -> r )
41
48
r
42
49
(Eff (st :: ST h | e ) r )
43
-
50
+
44
51
peekSTArray :: forall a h r . STArray h a -> Number -> Eff (st :: ST h | r ) (Maybe a )
45
52
peekSTArray arr i = runFn4 peekSTArrayImpl arr i Just Nothing
46
53
@@ -58,19 +65,67 @@ foreign import pokeSTArrayImpl """
58
65
Number
59
66
a
60
67
(Eff (st :: ST h | e ) Boolean )
61
-
68
+
62
69
pokeSTArray :: forall a h r . STArray h a -> Number -> a -> Eff (st :: ST h | r ) Boolean
63
70
pokeSTArray arr i a = runFn3 pokeSTArrayImpl arr i a
64
71
65
- foreign import pushSTArrayImpl " " "
66
- function pushSTArrayImpl(arr, a) {
67
- return function() {
68
- arr.push(a);
69
- return {};
72
+ foreign import pushAllSTArrayImpl " " "
73
+ function pushAllSTArrayImpl(arr, as) {
74
+ return function(){
75
+ return arr.push.apply(arr, as);
70
76
};
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
77
+ }" " " :: forall a h r . Fn2 (STArray h a )
78
+ [a ]
79
+ (Eff (st :: ST h | r ) Number )
80
+
81
+ pushAllSTArray :: forall a h r . STArray h a -> [a ] -> Eff (st :: ST h | r ) Number
82
+ pushAllSTArray = runFn2 pushAllSTArrayImpl
83
+
84
+ pushSTArray :: forall a h r . STArray h a -> a -> Eff (st :: ST h | r ) Number
85
+ pushSTArray arr a = pushAllSTArray arr [a]
86
+
87
+ foreign import spliceSTArrayImpl " " "
88
+ function spliceSTArrayImpl(arr, index, howMany, bs) {
89
+ return function(){
90
+ return arr.splice.apply(arr, [index, howMany].concat(bs));
91
+ };
92
+ }" " " :: forall a h r . Fn4 (STArray h a )
93
+ Number
94
+ Number
95
+ [a ]
96
+ (Eff (st :: ST h | r ) [a ])
97
+
98
+ spliceSTArray :: forall a h r . STArray h a -> Number -> Number -> [a ] -> Eff (st :: ST h | r ) [a ]
99
+ spliceSTArray = runFn4 spliceSTArrayImpl
100
+
101
+ foreign import copyImpl " " "
102
+ function copyImpl(arr) {
103
+ return function(){
104
+ var as = [];
105
+ var i = -1;
106
+ var n = arr.length;
107
+ while(++i < n) {
108
+ as[i] = arr[i];
109
+ }
110
+ return as;
111
+ };
112
+ }" " " :: forall a b h r . a -> Eff (st :: ST h | r ) b
113
+
114
+ freeze :: forall a h r . STArray h a -> Eff (st :: ST h | r ) [a ]
115
+ freeze = copyImpl
116
+
117
+ thaw :: forall a h r . [a ] -> Eff (st :: ST h | r ) (STArray h a )
118
+ thaw = copyImpl
119
+
120
+ foreign import toAssocArray " " "
121
+ function toAssocArray(arr) {
122
+ return function(){
123
+ var as = [];
124
+ var i = -1;
125
+ var n = arr.length;
126
+ while(++i < n) {
127
+ as[i] = {value: arr[i], index: i};
128
+ }
129
+ return as;
130
+ };
131
+ }" " " :: forall a h r . STArray h a -> Eff (st :: ST h | r ) [Assoc a ]
0 commit comments