1
1
module Data.Array.ST
2
2
( STArray (..)
3
+ , Assoc ()
3
4
, runSTArray
4
5
, emptySTArray
5
6
, peekSTArray
6
7
, pokeSTArray
7
8
, pushSTArray
9
+ , pushAllSTArray
10
+ , spliceSTArray
11
+ , getElems
12
+ , getAssocs
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;
@@ -62,15 +69,57 @@ foreign import pokeSTArrayImpl """
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 )
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
74
83
75
- pushSTArray :: forall a h r . STArray h a -> a -> Eff (st :: ST h | r ) Unit
76
- pushSTArray arr a = runFn2 pushSTArrayImpl arr a
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 getElems " " "
102
+ function getElems(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 h r . STArray h a -> Eff (st :: ST h | r ) [a ]
113
+
114
+ foreign import getAssocs " " "
115
+ function getAssocs(arr) {
116
+ return function(){
117
+ var as = [];
118
+ var i = -1;
119
+ var n = arr.length;
120
+ while(++i < n) {
121
+ as[i] = {value: arr[i], index: i};
122
+ }
123
+ return as;
124
+ };
125
+ }" " " :: forall a h r . STArray h a -> Eff (st :: ST h | r ) [Assoc a ]
0 commit comments