Skip to content

Commit 3ef7d45

Browse files
committed
Fix pokeSTArray, some optimizations
1 parent 07ec880 commit 3ef7d45

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

src/Data/Array/ST.purs

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -50,34 +50,31 @@ foreign import emptySTArray """
5050
}""" :: forall a h r. Eff (st :: ST h | r) (STArray h a)
5151

5252
foreign import peekSTArrayImpl """
53-
function peekSTArrayImpl(arr, i, s, f) {
53+
function peekSTArrayImpl(just, nothing, arr, i) {
5454
return function() {
55-
var index = ~~i;
56-
if (0 <= index && index < arr.length) {
57-
return s(arr[index]);
58-
} else {
59-
return f;
60-
}
55+
var index = i >>> 0;
56+
var len = arr.length >>> 0;
57+
return index < len? just(arr[index]) : nothing;
6158
};
62-
}""" :: forall a h e r. Fn4 (STArray h a)
63-
Number
64-
(a -> r)
59+
}""" :: forall a h e r. Fn4 (a -> r)
6560
r
61+
(STArray h a)
62+
Number
6663
(Eff (st :: ST h | e) r)
6764

6865
-- | Read the value at the specified index in a mutable array.
6966
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
70-
peekSTArray arr i = runFn4 peekSTArrayImpl arr i Just Nothing
67+
peekSTArray = runFn4 peekSTArrayImpl Just Nothing
7168

7269
foreign import pokeSTArrayImpl """
7370
function pokeSTArrayImpl(arr, i, a) {
7471
return function() {
75-
var index = ~~i;
76-
if (0 <= index && index <= arr.length) {
72+
var index = i >>> 0;
73+
var len = arr.length >>> 0;
74+
var ret = index < len;
75+
if (ret)
7776
arr[index] = a;
78-
return true;
79-
}
80-
return false;
77+
return ret;
8178
};
8279
}""" :: forall a h e. Fn3 (STArray h a)
8380
Number
@@ -86,7 +83,7 @@ foreign import pokeSTArrayImpl """
8683

8784
-- | Change the value at the specified index in a mutable array.
8885
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
89-
pokeSTArray arr i a = runFn3 pokeSTArrayImpl arr i a
86+
pokeSTArray = runFn3 pokeSTArrayImpl
9087

9188
foreign import pushAllSTArrayImpl """
9289
function pushAllSTArrayImpl(arr, as) {
@@ -123,12 +120,10 @@ spliceSTArray = runFn4 spliceSTArrayImpl
123120
foreign import copyImpl """
124121
function copyImpl(arr) {
125122
return function(){
126-
var as = [];
127-
var i = -1;
128-
var n = arr.length;
129-
while(++i < n) {
123+
var n = arr.length >>> 0;
124+
var as = new Array(n);
125+
for (var i = 0 >>> 0; i < n; i++)
130126
as[i] = arr[i];
131-
}
132127
return as;
133128
};
134129
}""" :: forall a b h r. a -> Eff (st :: ST h | r) b
@@ -146,12 +141,10 @@ thaw = copyImpl
146141
foreign import toAssocArray """
147142
function toAssocArray(arr) {
148143
return function(){
149-
var as = [];
150-
var i = -1;
151-
var n = arr.length;
152-
while(++i < n) {
144+
var n = arr.length >>> 0;
145+
var as = new Array(n);
146+
for (var i = 0 >>> 0; i < n; i++)
153147
as[i] = {value: arr[i], index: i};
154-
}
155148
return as;
156149
};
157150
}""" :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]

0 commit comments

Comments
 (0)