@@ -1,482 +1,214 @@
1−Elm.List = function() {
1+function nativeList(elm) {
3− var throwError = function(f) {
3+ function throwError(f) {
4− throw new Error("Function '" + f + "' expecting a list!");
4+ throw new Error("Function '" + f + "' expects a non-empty list!");
7− function length(xs) {
7+ function toArray(xs) {
8− var out = 0;
8+ var out = [];
9− while (xs[0] === "Cons") {
9+ while (xs[0] === "Cons") {
10− out += 1;
10+ out.push(xs[1]);
11− xs = xs[2];
11+ xs = xs[2];
13− return out;
13+ return out;
15− var reverse = foldl(function(x_72) {
15+
16− return function(y_73) {
16+ function fromArray(arr) {
17− return["Cons", x_72, y_73]
20− var concat = foldr(function(x_74) {
21− return function(y_75) {
22− return Value.append(x_74, y_75)
24− })(["Nil"]);
17+ var out = ["Nil"];
25− var and = foldl(function(x_77) {
18+ for (var i = arr.length; i--; ) {
26− return function(y_78) {
19+ out = ["Cons", arr[i], out];
30− var or = foldl(function(x_79) {
31− return function(y_80) {
35− var sum = foldl(function(x_89) {
36− return function(y_90) {
40− var product = foldl(function(x_91) {
41− return function(y_92) {
45− var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
46− var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
48− if (v[0] !== "Cons") {
49− throw new Error("Error: 'head' only accepts lists of length greater than one.");
54− if (v[0] !== "Cons") {
55− throw new Error("Error: 'tail' only accepts lists of length greater than one.");
60− if (v[0] !== "Cons") {
61− throw new Error("Error: 'last' only accepts lists of length greater than one.");
64− while (v[0] === "Cons") {
71− return function(xs) {
72− if (xs[0] === "Nil") { return xs; }
73− if (xs[0] !== "Cons") { throwError('map'); }
74− var root = ["Cons", f(xs[1]), ["Nil"]];
77− while (xs[0]==="Cons") {
78− curr[2] = ["Cons", f(xs[1]), ["Nil"]];
82− return root;
21+ return out;
85− function foldl(f) {
24+ function head(v) { v[0] === "Nil" ? throwError('head') : return v[1]; }
86− return function(b) {
25+ function tail(v) { v[0] === "Nil" ? throwError('tail') : return v[2]; }
87− return function(xs) {
26+
88− var acc = b;
27+ function last(xs) {
89− if (xs[0] === "Nil") { return acc; }
90− if (xs[0] !== "Cons") { throwError('foldl'); }
28+ if (xs[0] === "Nil") { throwError('last'); }
91− while (xs[0] === "Cons") {
30+ while (xs[0] === "Cons") {
92− acc = f(xs[1])(acc);
31+ out = xs[1];
93− xs = xs[2];
32+ xs = xs[2];
95− return acc;
34+ return out;
100− return function(b) {
101− return function(xs) {
37+ function map(f) { return function(xs) {
102− var acc = b;
38+ var arr = [];
103− if (xs[0] === "Nil") { return acc; }
39+ while (xs[0] === "Cons") {
104− if (xs[0] !== "Cons") { throwError('foldr'); }
40+ arr.push(f(xs[1]));
43+ return fromArray(arr);
47+ function foldl(f) { return function(b) { return function(xs) {
105− var arr = [];
48+ var acc = b;
106− while (xs[0] === "Cons") {
49+ while (xs[0] === "Cons") {
107− arr.push(xs[1]);
50+ acc = f(xs[1])(acc);
108− xs = xs[2];
51+ xs = xs[2];
58+ function foldr(f) { return function(b) { return function(xs) {
59+ var arr = toArray(xs);
110− for (var i = arr.length; i--; ) {
61+ for (var i = arr.length; i--; ) {
111− acc = f(arr[i])(acc);
62+ acc = f(arr[i])(acc);
113− return acc;
64+ return acc;
117− function foldl1(f_49) {
68+
118− return function(_temp_50) {
119− return function(v) {
69+ function foldl1(f) { return function(xs) {
120− if("Cons" !== v[0]) {
70+ xs[0] === "Nil" ? throwError('foldl1') : return foldl(f)(xs[1])(xs[2]);
121− return undefined
71+ }
125− return foldl(f_49)(x_51)(xs_52)
130− function foldr1(f) {
131− return function(xs) {
74+ function foldr1(f) { return function(xs) {
132− if (xs[0] === "Nil") { throw new Error("'foldr1' requires an non-empty list.") }
133− if (xs[0] !== "Cons") { throwError('foldr1'); }
75+ if (xs[0] === "Nil") { throwError('foldr1'); }
134− var arr = [];
76+ var arr = toArray(xs);
135− while (xs[0] === "Cons") {
139− var acc = arr.pop();
77+ var acc = arr.pop();
140− for (var i = arr.length; i--; ) {
78+ for (var i = arr.length; i--; ) {
141− acc = f(arr[i])(acc);
79+ acc = f(arr[i])(acc);
143− return acc;
81+ return acc;
146− function scanl(f) {
84+
147− return function(b) {
148− return function(xs) {
85+ function scanl(f) { return function(b) { return function(xs) {
149− if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
150− if (xs[0] !== "Cons") { throwError('scanl'); }
151− var arr = [b];
86+ var arr = toArray(xs);
152− while (xs[0] === "Cons") {
154− arr.push(b);
87+ arr.unshift(b);
155− xs = xs[2];
88+ var len = arr.length;
158− for (var i = arr.length; i--; ) {
89+ for (var i = 1; i < len; ++i) {
159− out = ["Cons", arr[i], out];
90+ arr[i] = f(arr[i])(arr[i-1]);
161− return out;
92+ return fromArray(arr);
165− function scanl1(f) {
96+
166− return function(xs) {
97+ function scanl1(f) { return function(xs) {
167− if (xs[0] !== "Cons") {
168− throw new Error("Error: 'scanl1' requires a list of at least length 1.");
170− return scanl(f)(xs[1])(xs[2]);
98+ xs[0] === "Nil" ? throwError('scanl1') : return scanl(f)(xs[1])(xs[2]);
173− function filter(pred) {
102+ function filter(pred) { return function(xs) {
174− return function(xs) {
175− if (xs[0] === "Nil") { return xs; }
176− if (xs[0] !== "Cons") { throwError('filter'); }
177− var arr = [];
103+ var arr = [];
178− while (xs[0] === "Cons") {
104+ while (xs[0] === "Cons") {
179− if (pred(xs[1])) { arr.push(xs[1]); }
105+ if (pred(xs[1])) { arr.push(xs[1]); }
180− xs = xs[2];
106+ xs = xs[2];
182− var out = ["Nil"];
108+ return fromArray(arr);
183− for (var i = arr.length; i--; ) {
109+ }
184− out = ["Cons", arr[i], out];
110+ }
112+ function length(xs) {
114+ while (xs[0] === "Cons") {
186− return out;
118+ return out;
189− function concatMap(f_76) {
121+ function reverse(xs) { return fromArray(toArray(xs).reverse()); }
190− return function(x) {
122+
191− return concat(map(f_76)(x))
194− function all(pred) {
123+ function all(pred) { return function(xs) {
195− return foldl(function(x) { return function(acc) {
124+ while (xs[0] === "Cons") {
196− return acc && pred(x);
125+ if (!pred(xs[1])) return false;
197− };})(true);
126+ xs = xs[2];
199− function any(pred) {
200− return foldl(function(x) { return function(acc) {
201− return acc || pred(x);
204− function partition(pred_93) {
205− return function(lst_94) {
208− var c = [function(v) {
209− if("Nil" !== v[0]) {
212− return["Tuple2", ["Nil"], ["Nil"]]
215− if("Cons" !== v[0]) {
220− return function(v) {
221− if("Tuple2" !== v[0]) {
226− return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
228− }(partition(pred_93)(xs_96))
231− for(var i = c.length;i--;) {
233− if(r !== undefined) {
240− function zipWith(f) {
241− return function(listA) {
242− return function(listB) {
243− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
244− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
246− while (listA[0] === "Cons" && listB[0] === "Cons") {
247− arr.push(f(listA[1])(listB[1]));
252− for (var i = arr.length; i--; ) {
253− out = ["Cons", arr[i], out];
259− function zip(listA) {
260− return function(listB) {
261− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
262− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
264− while (listA[0] === "Cons" && listB[0] === "Cons") {
265− arr.push(["Tuple2", listA[1], listB[1]]);
270− for (var i = arr.length; i--; ) {
271− out = ["Cons", arr[i], out];
276− function unzip(pairs_112) {
279− var c = [function(v) {
280− if("Nil" !== v[0]) {
283− return["Tuple2", ["Nil"], ["Nil"]]
286− if("Cons" !== v[0]) {
291− return function(v) {
292− if("Tuple2" !== v[0]) {
295− if("Tuple2" !== v[1][0]) {
298− var x_115 = v[1][1];
299− var y_116 = v[1][2];
300− if("Tuple2" !== v[2][0]) {
303− var xs_117 = v[2][1];
304− var ys_118 = v[2][2];
305− return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
309− }(["Tuple2", p_113, unzip(ps_114)])
312− for(var i = c.length;i--;) {
314− if(r !== undefined) {
320− function intersperse(sep_119) {
321− return function(xs_120) {
324− var c = [function(v) {
325− if("Nil" !== v[0]) {
331− if("Cons" !== v[0]) {
335− if("Nil" !== v[2][0]) {
338− return["Cons", a_124, ["Nil"]]
342− if("Cons" !== v[0]) {
346− if("Cons" !== v[2][0]) {
349− var b_122 = v[2][1];
350− var cs_123 = v[2][2];
351− return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
355− for(var i = c.length;i--;) {
357− if(r !== undefined) {
364− function intercalate(sep_125) {
365− return function(xs_126) {
368− var c = [function(v) {
369− if("Nil" !== v[0]) {
375− if("Cons" !== v[0]) {
379− if("Nil" !== v[2][0]) {
386− if("Cons" !== v[0]) {
390− if("Cons" !== v[2][0]) {
393− var b_128 = v[2][1];
394− var cs_129 = v[2][2];
395− return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
399− for(var i = c.length;i--;) {
401− if(r !== undefined) {
402− return r
128+ return true;
408− function sort(xs) {
132+ function any(pred) { return function(xs) {
409− if (xs[0] === "Nil") { return xs; }
133+ while (xs[0] === "Cons") {
410− if (xs[0] !== "Cons") { throwError('sort'); }
134+ if (pred(xs[1])) return true;
141+ function zipWith(f) { return function(xs) { return function(ys) {
411− var arr = [];
142+ var arr = [];
412− while (xs[0] === "Cons") {
143+ while (xs[0] === "Cons" && ys[0] === "Cons") {
413− arr.push(xs[1]);
144+ arr.push(f(xs[1])(ys[1]));
414− xs = xs[2];
145+ xs = xs[2];
416− arr.sort(function(a,b) { return a - b});
418− for (var i = arr.length; i--; ) {
419− out = [ "Cons", arr[i], out ];
421− return out;
148+ return fromArray(arr);
423− function take(n) { return function(xs) {
153+ function zip(xs) { return function(ys) {
424− if (n <= 0) { return ["Nil"]; }
154+ var arr = [];
425− if (xs[0] === "Nil") { return xs; }
155+ while (xs[0] === "Cons" && ys[0] === "Cons") {
426− if (xs[0] !== "Cons") { throwError('take'); }
156+ arr.push(["Tuple2",xs[1],ys[1]]);
427− var out = [ "Cons", xs[1], ["Nil"] ];
157+ xs = xs[2];
428− var temp = out;
158+ ys = ys[2];
430− --n;
160+ return fromArray(arr);
431− while (xs[0] === "Cons" && n > 0) {
161+ }
432− temp[2] = [ "Cons", xs[1], ["Nil"] ];
162+ }
165+ return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
168+ function take(n) { return function(xs) {
170+ while (xs[0] === "Cons" && n > 0) {
434− xs = xs[2];
172+ xs = xs[2];
437− return out;
175+ return fromArray(arr);
440− function drop(n) { return function(xs) {
179+ function drop(n) { return function(xs) {
441− if (xs[0] === "Nil") { return xs; }
442− if (xs[0] !== "Cons") { throwError('drop'); }
443− while (xs[0] === "Cons" && n > 0) {
180+ while (xs[0] === "Cons" && n > 0) {
444− xs = xs[2];
181+ xs = xs[2];
447− return xs;
184+ return xs;
450− return {head:head,
191+ head:head,
451− tail:tail,
192+ tail:tail,
452− last:last,
193+ last:last,
453− map:map,
195+ map:map,
454− foldl:foldl,
196+ foldl:foldl,
455− foldr:foldr,
197+ foldr:foldr,
456− foldl1:foldl1,
199+ foldl1:foldl1,
457− foldr1:foldr1,
200+ foldr1:foldr1,
458− scanl:scanl,
201+ scanl:scanl,
459− scanl1:scanl1,
202+ scanl1:scanl1,
460− filter:filter,
203+ filter:filter,
461− length:length,
204+ length:length,
462− reverse:reverse,
205+ reverse:reverse,
464− concatMap:concatMap,
467− all:all,
207+ all:all,
468− any:any,
208+ any:any,
473− partition:partition,
474− zipWith:zipWith,
209+ zipWith:zipWith,
475− zip:zip,
210+ zip:zip,
477− intersperse:intersperse,
478− intercalate:intercalate,
479− sort:sort,
211+ sort:sort,
480− take:take,
212+ take:take,
481− drop:drop};
213+ drop:drop};