on master help sign in
List.js minor bugfixes
441e907ngunn
libraries/Native/List.js+24−21
@@ -7,7 +7,11 @@ Elm.Native.List = function(elm) {
7
7
8 var Utils = Elm.Native.Utils(elm);
8 var Utils = Elm.Native.Utils(elm);
9
9
10+ // freeze is universally supported and as a singleton introduces little performance penalty
11+ // for a small amount of object safety
10− var Nil = { ctor:'Nil' };
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
11 function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
15 function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
12
16
13 function throwError(f) {
17 function throwError(f) {
@@ -22,7 +26,7 @@ Elm.Native.List = function(elm) {
22 }
26 }
23 return out;
27 return out;
24 }
28 }
25−
29+
26 function fromArray(arr) {
30 function fromArray(arr) {
27 var out = Nil;
31 var out = Nil;
28 for (var i = arr.length; i--; ) {
32 for (var i = arr.length; i--; ) {
@@ -79,7 +83,7 @@ Elm.Native.List = function(elm) {
79 function foldl(f, b, xs) {
83 function foldl(f, b, xs) {
80 var acc = b;
84 var acc = b;
81 while (xs.ctor === "Cons") {
85 while (xs.ctor === "Cons") {
82− acc = f(xs._0)(acc);
86+ acc = A2(f, acc, xs._0);
83 xs = xs._1;
87 xs = xs._1;
84 }
88 }
85 return acc;
89 return acc;
@@ -89,7 +93,7 @@ Elm.Native.List = function(elm) {
89 var arr = toArray(xs);
93 var arr = toArray(xs);
90 var acc = b;
94 var acc = b;
91 for (var i = arr.length; i--; ) {
95 for (var i = arr.length; i--; ) {
92− acc = f(arr[i])(acc);
96+ acc = A2(f, arr[i], acc);
93 }
97 }
94 return acc;
98 return acc;
95 }
99 }
@@ -117,7 +121,7 @@ Elm.Native.List = function(elm) {
117 }
121 }
118 return fromArray(arr);
122 return fromArray(arr);
119 }
123 }
120−
124+
121 function scanl1(f, xs) {
125 function scanl1(f, xs) {
122 return xs.ctor === "Nil" ? throwError('scanl1') : scanl(f, xs._0, xs._1);
126 return xs.ctor === "Nil" ? throwError('scanl1') : scanl(f, xs._0, xs._1);
123 }
127 }
@@ -141,7 +145,6 @@ Elm.Native.List = function(elm) {
141 }
145 }
142
146
143 function member(x, xs) {
147 function member(x, xs) {
144− var out = 0;
145 while (xs.ctor === "Cons") {
148 while (xs.ctor === "Cons") {
146 if (Utils.eq(x,xs._0)) return true;
149 if (Utils.eq(x,xs._0)) return true;
147 xs = xs._1;
150 xs = xs._1;
@@ -160,7 +163,7 @@ Elm.Native.List = function(elm) {
160 }
163 }
161 return xs;
164 return xs;
162 }
165 }
163−
166+
164 function all(pred, xs) {
167 function all(pred, xs) {
165 while (xs.ctor === "Cons") {
168 while (xs.ctor === "Cons") {
166 if (!pred(xs._0)) return false;
169 if (!pred(xs._0)) return false;
@@ -200,11 +203,11 @@ Elm.Native.List = function(elm) {
200 function sort(xs) {
203 function sort(xs) {
201 function cmp(a,b) {
204 function cmp(a,b) {
202 var ord = Utils.compare(a,b);
205 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;
204 }
207 }
205 return fromArray(toArray(xs).sort(cmp));
208 return fromArray(toArray(xs).sort(cmp));
206 }
209 }
207−
210+
208 function take(n, xs) {
211 function take(n, xs) {
209 var arr = [];
212 var arr = [];
210 while (xs.ctor === "Cons" && n > 0) {
213 while (xs.ctor === "Cons" && n > 0) {
@@ -224,7 +227,7 @@ Elm.Native.List = function(elm) {
224 }
227 }
225
228
226 function join(sep, xss) {
229 function join(sep, xss) {
227− if (xss.ctor === 'Nil') return {ctor:'Nil'}
230+ if (xss.ctor === 'Nil') return Nil;
228 var s = toArray(sep);
231 var s = toArray(sep);
229 var out = toArray(xss._0);
232 var out = toArray(xss._0);
230 xss = xss._1;
233 xss = xss._1;
@@ -236,37 +239,37 @@ Elm.Native.List = function(elm) {
236 }
239 }
237
240
238 function split(sep, xs) {
241 function split(sep, xs) {
239− var out = {ctor:'Nil'};
242+ var out = Nil;
240 var array = toArray(xs);
243 var array = toArray(xs);
241 var s = toArray(sep);
244 var s = toArray(sep);
242 var slen = s.length;
245 var slen = s.length;
243 if (slen === 0) {
246 if (slen === 0) {
244 for (var i = array.length; i--; ) {
247 for (var i = array.length; i--; ) {
245− out = Cons(Cons(array[i],Nil), out);
248+ out = Cons(Cons(array[i],Nil), out);
246 }
249 }
247 return out;
250 return out;
248 }
251 }
249− var temp = {ctor:'Nil'};
252+ var temp = Nil;
250 for (var i = array.length - slen; i >= 0; --i) {
253 for (var i = array.length - slen; i >= 0; --i) {
251 var match = true;
254 var match = true;
252 for (var j = slen; j--; ) {
255 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; }
254 }
257 }
255 if (match) {
258 if (match) {
256− out = {ctor:'Cons', _0:temp, _1:out};
259+ out = Cons(temp,out);
257− temp = {ctor:'Nil'};
260+ temp = Nil;
258− i -= slen - 1;
261+ i -= slen - 1;
259 } else {
262 } else {
260− temp = {ctor:'Cons', _0:array[i+j], _1:temp};
263+ temp = Cons(array[i+j], temp);
261 }
264 }
262 }
265 }
263 for (var j = slen-1; j--; ) {
266 for (var j = slen-1; j--; ) {
264− temp = {ctor:'Cons', _0:array[j], _1:temp};
267+ temp = Cons(array[j], temp);
265 }
268 }
266− out = {ctor:'Cons', _0:temp, _1:out};
269+ out = Cons(temp, out);
267 return out;
270 return out;
268 }
271 }
269−
272+
270 return elm.Native.List = {
273 return elm.Native.List = {
271 Nil:Nil,
274 Nil:Nil,
272 Cons:Cons,
275 Cons:Cons,