@@ -0,0 +1,436 @@
1+var List = function() {
2+
3+ var throwError = function() { throw "Function expecting a list!"; }
4+
5+ function length(xs) {
6+ var out = 0;
7+ while (xs[0] === "Cons") {
8+ out += 1;
9+ xs = xs[2];
10+ }
11+ return out;
12+ };
13+ var reverse = foldl(function(x_72) {
14+ return function(y_73) {
15+ return["Cons", x_72, y_73]
16+ }
17+ })(["Nil"]);
18+ var concat = foldr(function(x_74) {
19+ return function(y_75) {
20+ return Value.append(x_74, y_75)
21+ }
22+ })(["Nil"]);
23+ var and = foldl(function(x_77) {
24+ return function(y_78) {
25+ return x_77 && y_78
26+ }
27+ })(true);
28+ var or = foldl(function(x_79) {
29+ return function(y_80) {
30+ return x_79 || y_80
31+ }
32+ })(false);
33+ var sum = foldl(function(x_89) {
34+ return function(y_90) {
35+ return x_89 + y_90
36+ }
37+ })(0);
38+ var product = foldl(function(x_91) {
39+ return function(y_92) {
40+ return x_91 * y_92
41+ }
42+ })(1);
43+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
44+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
45+ function head(v) {
46+ if (v[0] !== "Cons") {
47+ throw "Error: 'head' only accepts lists of length greater than one.";
48+ }
49+ return v[1];
50+ }
51+ function tail(v) {
52+ if (v[0] !== "Cons") {
53+ throw "Error: 'tail' only accepts lists of length greater than one.";
54+ }
55+ return v[2];
56+ }
57+ function map(f) {
58+ return function(xs) {
59+ if (xs[0] === "Nil") { return xs; }
60+ if (xs[0] !== "Cons") { throwError(); }
61+ var root = ["Cons", f(xs[1]), ["Nil"]];
62+ var curr = root;
63+ xs = xs[2];
64+ while (xs[0]==="Cons") {
65+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
66+ xs = xs[2];
67+ curr = curr[2];
68+ }
69+ return root;
70+ }
71+ }
72+ function foldl(f) {
73+ return function(b) {
74+ return function(xs) {
75+ var acc = b;
76+ if (xs[0] === "Nil") { return acc; }
77+ if (xs[0] !== "Cons") { throwError(); }
78+ while (xs[0] === "Cons") {
79+ acc = f(xs[1])(acc);
80+ xs = xs[2];
81+ }
82+ return acc;
83+ }
84+ }
85+ }
86+ function foldr(f) {
87+ return function(b) {
88+ return function(xs) {
89+ var acc = b;
90+ if (xs[0] === "Nil") { return acc; }
91+ if (xs[0] !== "Cons") { throwError(); }
92+ var arr = [];
93+ while (xs[0] === "Cons") {
94+ arr.push(xs[1]);
95+ xs = xs[2];
96+ }
97+ for (var i = arr.length; i--; ) {
98+ acc = f(arr[i])(acc);
99+ }
100+ return acc;
101+ }
102+ }
103+ }
104+ function foldl1(f_49) {
105+ return function(_temp_50) {
106+ return function(v) {
107+ if("Cons" !== v[0]) {
108+ return undefined
109+ }else {
110+ var x_51 = v[1];
111+ var xs_52 = v[2];
112+ return foldl(f_49)(x_51)(xs_52)
113+ }
114+ }(_temp_50)
115+ }
116+ }
117+ function foldr1(f_53) {
118+ return function(_temp_54) {
119+ return function(v) {
120+ if("Cons" !== v[0]) {
121+ return undefined
122+ }else {
123+ var x_55 = v[1];
124+ var xs_56 = v[2];
125+ return foldr(f_53)(x_55)(xs_56)
126+ }
127+ }(_temp_54)
128+ }
129+ }
130+ function scanl(f) {
131+ return function(b) {
132+ return function(xs) {
133+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
134+ if (xs[0] !== "Cons") { throwError(); }
135+ var arr = [b];
136+ while (xs[0] === "Cons") {
137+ b = f(xs[1])(b);
138+ arr.push(b);
139+ xs = xs[2];
140+ }
141+ var out = ["Nil"];
142+ for (var i = arr.length; i--; ) {
143+ out = ["Cons", arr[i], out];
144+ }
145+ return out;
146+ }
147+ }
148+ }
149+ function scanl1(f) {
150+ return function(xs) {
151+ if (xs[0] !== "Cons") {
152+ throw "Error: 'scanl1' requires a list of at least length 1.";
153+ }
154+ return scanl(f)(xs[1])(xs[2]);
155+ }
156+ }
157+ function filter(pred) {
158+ return function(xs) {
159+ if (xs[0] === "Nil") { return xs; }
160+ if (xs[0] !== "Cons") { throwError(); }
161+ var arr = [];
162+ while (xs[0] === "Cons") {
163+ if (pred(xs[1])) { arr.push(xs[1]); }
164+ xs = xs[2];
165+ }
166+ var out = ["Nil"];
167+ for (var i = arr.length; i--; ) {
168+ out = ["Cons", arr[i], out];
169+ }
170+ return out;
171+ }
172+ }
173+ function concatMap(f_76) {
174+ return function(x) {
175+ return concat(map(f_76)(x))
176+ }
177+ }
178+ function forall(pred) {
179+ return foldl(function(x) { return function(acc) {
180+ return acc && pred(x);
181+ };})(true);
182+ }
183+ function exists(pred) {
184+ return foldl(function(x) { return function(acc) {
185+ return acc || pred(x);
186+ };})(false);
187+ }
188+ function partition(pred_93) {
189+ return function(lst_94) {
190+ return function() {
191+ var v = lst_94;
192+ var c = [function(v) {
193+ if("Nil" !== v[0]) {
194+ return undefined
195+ }else {
196+ return["Tuple2", ["Nil"], ["Nil"]]
197+ }
198+ }, function(v) {
199+ if("Cons" !== v[0]) {
200+ return undefined
201+ }else {
202+ var x_95 = v[1];
203+ var xs_96 = v[2];
204+ return function(v) {
205+ if("Tuple2" !== v[0]) {
206+ return undefined
207+ }else {
208+ var as_97 = v[1];
209+ var bs_98 = v[2];
210+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
211+ }
212+ }(partition(pred_93)(xs_96))
213+ }
214+ }];
215+ for(var i = c.length;i--;) {
216+ var r = c[i](v);
217+ if(r !== undefined) {
218+ return r
219+ }
220+ }
221+ }()
222+ }
223+ }
224+ function zipWith(f) {
225+ return function(listA) {
226+ return function(listB) {
227+ if (listA[0] === "Nil" || listB[0] === "Nil") { return listA; }
228+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError(); }
229+ var arr = [];
230+ while (listA[0] === "Cons" && listB[0] === "Cons") {
231+ arr.push(f(listA[1])(listB[1]));
232+ listA = listA[2];
233+ listB = listB[2];
234+ }
235+ var out = ["Nil"];
236+ for (var i = arr.length; i--; ) {
237+ out = ["Cons", arr[i], out];
238+ }
239+ return out;
240+ }
241+ }
242+ }
243+ function zip(listA) {
244+ return function(listB) {
245+ if (listA[0] === "Nil" || listB[0] === "Nil") { return listA; }
246+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError(); }
247+ var arr = [];
248+ while (listA[0] === "Cons" && listB[0] === "Cons") {
249+ arr.push(["Tuple2", listA[1], listB[1]]);
250+ listA = listA[2];
251+ listB = listB[2];
252+ }
253+ var out = ["Nil"];
254+ for (var i = arr.length; i--; ) {
255+ out = ["Cons", arr[i], out];
256+ }
257+ return out;
258+ }
259+ }
260+ function unzip(pairs_112) {
261+ return function() {
262+ var v = pairs_112;
263+ var c = [function(v) {
264+ if("Nil" !== v[0]) {
265+ return undefined
266+ }else {
267+ return["Tuple2", ["Nil"], ["Nil"]]
268+ }
269+ }, function(v) {
270+ if("Cons" !== v[0]) {
271+ return undefined
272+ }else {
273+ var p_113 = v[1];
274+ var ps_114 = v[2];
275+ return function(v) {
276+ if("Tuple2" !== v[0]) {
277+ return undefined
278+ }else {
279+ if("Tuple2" !== v[1][0]) {
280+ return undefined
281+ }else {
282+ var x_115 = v[1][1];
283+ var y_116 = v[1][2];
284+ if("Tuple2" !== v[2][0]) {
285+ return undefined
286+ }else {
287+ var xs_117 = v[2][1];
288+ var ys_118 = v[2][2];
289+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
290+ }
291+ }
292+ }
293+ }(["Tuple2", p_113, unzip(ps_114)])
294+ }
295+ }];
296+ for(var i = c.length;i--;) {
297+ var r = c[i](v);
298+ if(r !== undefined) {
299+ return r
300+ }
301+ }
302+ }()
303+ }
304+ function intersperse(sep_119) {
305+ return function(xs_120) {
306+ return function() {
307+ var v = xs_120;
308+ var c = [function(v) {
309+ if("Nil" !== v[0]) {
310+ return undefined
311+ }else {
312+ return["Nil"]
313+ }
314+ }, function(v) {
315+ if("Cons" !== v[0]) {
316+ return undefined
317+ }else {
318+ var a_124 = v[1];
319+ if("Nil" !== v[2][0]) {
320+ return undefined
321+ }else {
322+ return["Cons", a_124, ["Nil"]]
323+ }
324+ }
325+ }, function(v) {
326+ if("Cons" !== v[0]) {
327+ return undefined
328+ }else {
329+ var a_121 = v[1];
330+ if("Cons" !== v[2][0]) {
331+ return undefined
332+ }else {
333+ var b_122 = v[2][1];
334+ var cs_123 = v[2][2];
335+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
336+ }
337+ }
338+ }];
339+ for(var i = c.length;i--;) {
340+ var r = c[i](v);
341+ if(r !== undefined) {
342+ return r
343+ }
344+ }
345+ }()
346+ }
347+ }
348+ function intercalate(sep_125) {
349+ return function(xs_126) {
350+ return function() {
351+ var v = xs_126;
352+ var c = [function(v) {
353+ if("Nil" !== v[0]) {
354+ return undefined
355+ }else {
356+ return["Nil"]
357+ }
358+ }, function(v) {
359+ if("Cons" !== v[0]) {
360+ return undefined
361+ }else {
362+ var a_130 = v[1];
363+ if("Nil" !== v[2][0]) {
364+ return undefined
365+ }else {
366+ return a_130
367+ }
368+ }
369+ }, function(v) {
370+ if("Cons" !== v[0]) {
371+ return undefined
372+ }else {
373+ var a_127 = v[1];
374+ if("Cons" !== v[2][0]) {
375+ return undefined
376+ }else {
377+ var b_128 = v[2][1];
378+ var cs_129 = v[2][2];
379+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
380+ }
381+ }
382+ }];
383+ for(var i = c.length;i--;) {
384+ var r = c[i](v);
385+ if(r !== undefined) {
386+ return r
387+ }
388+ }
389+ }()
390+ }
391+ }
392+ function sort(xs) {
393+ if (xs[0] === "Nil") { return xs; }
394+ if (xs[0] !== "Cons") { throwError(); }
395+ var arr = [];
396+ while (xs[0] === "Cons") {
397+ arr.push(xs[1]);
398+ xs = xs[2];
399+ }
400+ arr.sort(function(a,b) { return a - b});
401+ var out = ["Nil"];
402+ for (var i = arr.length; i--; ) {
403+ out = [ "Cons", arr[i], out ];
404+ }
405+ return out;
406+ }
407+ return {head:head,
408+ tail:tail,
409+ map:map,
410+ foldl:foldl,
411+ foldr:foldr,
412+ foldl1:foldl1,
413+ foldr1:foldr1,
414+ scanl:scanl,
415+ scanl1:scanl1,
416+ filter:filter,
417+ length:length,
418+ reverse:reverse,
419+ concat:concat,
420+ concatMap:concatMap,
421+ and:and,
422+ or:or,
423+ forall:forall,
424+ exists:exists,
425+ sum:sum,
426+ product:product,
427+ maximum:maximum,
428+ minimum:minimum,
429+ partition:partition,
430+ zipWith:zipWith,
431+ zip:zip,
432+ unzip:unzip,
433+ intersperse:intersperse,
434+ intercalate:intercalate,
435+ sort:sort};
436+}();