Skip to content

Commit b376ae8

Browse files
committed
Merge pull request #32 from jacereda/st-optimizations
Fix pokeSTArray, some optimizations
2 parents 07ec880 + 0d8fb40 commit b376ae8

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

src/Data/Array/ST.purs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,34 +50,29 @@ 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+
return index < arr.length? just(arr[index]) : nothing;
6157
};
62-
}""" :: forall a h e r. Fn4 (STArray h a)
63-
Number
64-
(a -> r)
58+
}""" :: forall a h e r. Fn4 (a -> r)
6559
r
60+
(STArray h a)
61+
Number
6662
(Eff (st :: ST h | e) r)
6763

6864
-- | Read the value at the specified index in a mutable array.
6965
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
66+
peekSTArray = runFn4 peekSTArrayImpl Just Nothing
7167

7268
foreign import pokeSTArrayImpl """
7369
function pokeSTArrayImpl(arr, i, a) {
7470
return function() {
75-
var index = ~~i;
76-
if (0 <= index && index <= arr.length) {
71+
var index = i >>> 0;
72+
var ret = index < arr.length;
73+
if (ret)
7774
arr[index] = a;
78-
return true;
79-
}
80-
return false;
75+
return ret;
8176
};
8277
}""" :: forall a h e. Fn3 (STArray h a)
8378
Number
@@ -86,7 +81,7 @@ foreign import pokeSTArrayImpl """
8681

8782
-- | Change the value at the specified index in a mutable array.
8883
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
84+
pokeSTArray = runFn3 pokeSTArrayImpl
9085

9186
foreign import pushAllSTArrayImpl """
9287
function pushAllSTArrayImpl(arr, as) {
@@ -123,12 +118,10 @@ spliceSTArray = runFn4 spliceSTArrayImpl
123118
foreign import copyImpl """
124119
function copyImpl(arr) {
125120
return function(){
126-
var as = [];
127-
var i = -1;
128121
var n = arr.length;
129-
while(++i < n) {
122+
var as = new Array(n);
123+
for (var i = 0; i < n; i++)
130124
as[i] = arr[i];
131-
}
132125
return as;
133126
};
134127
}""" :: forall a b h r. a -> Eff (st :: ST h | r) b
@@ -146,12 +139,10 @@ thaw = copyImpl
146139
foreign import toAssocArray """
147140
function toAssocArray(arr) {
148141
return function(){
149-
var as = [];
150-
var i = -1;
151142
var n = arr.length;
152-
while(++i < n) {
143+
var as = new Array(n);
144+
for (var i = 0; i < n; i++)
153145
as[i] = {value: arr[i], index: i};
154-
}
155146
return as;
156147
};
157148
}""" :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]

0 commit comments

Comments
 (0)