on master help sign in
List.js minor bugfixes

freeze Nil (one-time overhead for marginal safety) don't do this for Cons (huge performance overhead) use Nil throughout instead of making our own (if we're having a singleton, we should be consistently using it) missing A2, A3 in places. foldl function applied args in wrong order, foldl :: (a -> b -> a) -> a -> [b] -> a sort: missing .ctor selector

commit441e90770bb3217e8bd6ba8ea6258e6795d174e0 authorngunn <ngunn@computationalthinking.org.uk> dateMon 25 Mar 2013, 17:36 (14 years ago) parent545be51
1 file changed+24−21
libraries/Native/List.js+24−21
libraries/Native/List.js+24−21
@@ -7,7 +7,11 @@ Elm.Native.List = function(elm) {
77
88 var Utils = Elm.Native.Utils(elm);
99
10− var Nil = { ctor:'Nil' };
10+ // freeze is universally supported and as a singleton introduces little performance penalty
11+ // for a small amount of object safety
12+ var Nil = Object.freeze({ ctor:'Nil' });
13+
14+ // using freeze for every cons would be nice but is a huge (9x on firefox 19) performance penalty
1115 function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
1216
1317 function throwError(f) {
@@ -22,7 +26,7 @@ Elm.Native.List = function(elm) {
2226 }
2327 return out;
2428 }
25−
29+
2630 function fromArray(arr) {
2731 var out = Nil;
2832 for (var i = arr.length; i--; ) {
@@ -79,7 +83,7 @@ Elm.Native.List = function(elm) {
7983 function foldl(f, b, xs) {
8084 var acc = b;
8185 while (xs.ctor === "Cons") {
82− acc = f(xs._0)(acc);
86+ acc = A2(f, acc, xs._0);
8387 xs = xs._1;
8488 }
8589 return acc;
@@ -89,7 +93,7 @@ Elm.Native.List = function(elm) {
8993 var arr = toArray(xs);
9094 var acc = b;
9195 for (var i = arr.length; i--; ) {
92− acc = f(arr[i])(acc);
96+ acc = A2(f, arr[i], acc);
9397 }
9498 return acc;
9599 }
@@ -117,7 +121,7 @@ Elm.Native.List = function(elm) {
117121 }
118122 return fromArray(arr);
119123 }
120−
124+
121125 function scanl1(f, xs) {
122126 return xs.ctor === "Nil" ? throwError('scanl1') : scanl(f, xs._0, xs._1);
123127 }
@@ -141,7 +145,6 @@ Elm.Native.List = function(elm) {
141145 }
142146
143147 function member(x, xs) {
144− var out = 0;
145148 while (xs.ctor === "Cons") {
146149 if (Utils.eq(x,xs._0)) return true;
147150 xs = xs._1;
@@ -160,7 +163,7 @@ Elm.Native.List = function(elm) {
160163 }
161164 return xs;
162165 }
163−
166+
164167 function all(pred, xs) {
165168 while (xs.ctor === "Cons") {
166169 if (!pred(xs._0)) return false;
@@ -200,11 +203,11 @@ Elm.Native.List = function(elm) {
200203 function sort(xs) {
201204 function cmp(a,b) {
202205 var ord = Utils.compare(a,b);
203− return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1;
206+ return ord.ctor === 'EQ' ? 0 : ord.ctor === 'LT' ? -1 : 1;
204207 }
205208 return fromArray(toArray(xs).sort(cmp));
206209 }
207−
210+
208211 function take(n, xs) {
209212 var arr = [];
210213 while (xs.ctor === "Cons" && n > 0) {
@@ -224,7 +227,7 @@ Elm.Native.List = function(elm) {
224227 }
225228
226229 function join(sep, xss) {
227− if (xss.ctor === 'Nil') return {ctor:'Nil'}
230+ if (xss.ctor === 'Nil') return Nil;
228231 var s = toArray(sep);
229232 var out = toArray(xss._0);
230233 xss = xss._1;
@@ -236,37 +239,37 @@ Elm.Native.List = function(elm) {
236239 }
237240
238241 function split(sep, xs) {
239− var out = {ctor:'Nil'};
242+ var out = Nil;
240243 var array = toArray(xs);
241244 var s = toArray(sep);
242245 var slen = s.length;
243246 if (slen === 0) {
244247 for (var i = array.length; i--; ) {
245− out = Cons(Cons(array[i],Nil), out);
248+ out = Cons(Cons(array[i],Nil), out);
246249 }
247250 return out;
248251 }
249− var temp = {ctor:'Nil'};
252+ var temp = Nil;
250253 for (var i = array.length - slen; i >= 0; --i) {
251254 var match = true;
252255 for (var j = slen; j--; ) {
253− if (!Utils.eq(array[i+j], s[j])) { match = false; break; }
256+ if (!Utils.eq(array[i+j], s[j])) { match = false; break; }
254257 }
255258 if (match) {
256− out = {ctor:'Cons', _0:temp, _1:out};
257− temp = {ctor:'Nil'};
258− i -= slen - 1;
259+ out = Cons(temp,out);
260+ temp = Nil;
261+ i -= slen - 1;
259262 } else {
260− temp = {ctor:'Cons', _0:array[i+j], _1:temp};
263+ temp = Cons(array[i+j], temp);
261264 }
262265 }
263266 for (var j = slen-1; j--; ) {
264− temp = {ctor:'Cons', _0:array[j], _1:temp};
267+ temp = Cons(array[j], temp);
265268 }
266− out = {ctor:'Cons', _0:temp, _1:out};
269+ out = Cons(temp, out);
267270 return out;
268271 }
269−
272+
270273 return elm.Native.List = {
271274 Nil:Nil,
272275 Cons:Cons,