on master help sign in
Add the native function module and transform the list library to use it.
commit9eddb7a3bd5c511e1b1299a6a4c0876f9fb6a04c authorevancz <info@elm-lang.org> dateWed 27 Feb 2013, 09:46 (14 years ago) parentc5519e3
2 files changed+162−72
core/Native/Function.js+104 core/Native/List.js+58−72
core/Native/Function.jsnew file+104
@@ -0,0 +1,104 @@
1+/*
2+module Native.Function where
3+*/
4+
5+function F2(fun) {
6+ function wrapper(a) { return function(b) { return fun(a,b) } }
7+ wrapper.arity = 2;
8+ wrapper.func = fun;
9+ return wrapper;
10+}
11+
12+function F3(fun) {
13+ function wrapper(a) {
14+ return function(b) { return function(c) { return fun(a,b,c) }}
15+ }
16+ wrapper.arity = 3;
17+ wrapper.func = fun;
18+ return wrapper;
19+}
20+
21+function F4(fun) {
22+ function wrapper(a) { return function(b) { return function(c) {
23+ return function(d) { return fun(a,b,c,d) }}}
24+ }
25+ wrapper.arity = 4;
26+ wrapper.func = fun;
27+ return wrapper;
28+}
29+
30+function F5(fun) {
31+ function wrapper(a) { return function(b) { return function(c) {
32+ return function(d) { return function(e) { return fun(a,b,c,d,e) }}}}
33+ }
34+ wrapper.arity = 5;
35+ wrapper.func = fun;
36+ return wrapper;
37+}
38+
39+function F6(fun) {
40+ function wrapper(a) { return function(b) { return function(c) {
41+ return function(d) { return function(e) { return function(f) {
42+ return fun(a,b,c,d,e,f) }}}}}
43+ }
44+ wrapper.arity = 6;
45+ wrapper.func = fun;
46+ return wrapper;
47+}
48+
49+function F7(fun) {
50+ function wrapper(a) { return function(b) { return function(c) {
51+ return function(d) { return function(e) { return function(f) {
52+ return function(g) { return fun(a,b,c,d,e,f,g) }}}}}}
53+ }
54+ wrapper.arity = 7;
55+ wrapper.func = fun;
56+ return wrapper;
57+}
58+
59+function F8(fun) {
60+ function wrapper(a) { return function(b) { return function(c) {
61+ return function(d) { return function(e) { return function(f) {
62+ return function(g) { return function(h) {return fun(a,b,c,d,e,f,g,h)}}}}}}}
63+ }
64+ wrapper.arity = 8;
65+ wrapper.func = fun;
66+ return wrapper;
67+}
68+
69+function F9(fun) {
70+ function wrapper(a) { return function(b) { return function(c) {
71+ return function(d) { return function(e) { return function(f) {
72+ return function(g) { return function(h) { return function(i) {
73+ return fun(a,b,c,d,e,f,g,h,i) }}}}}}}}
74+ }
75+ wrapper.arity = 9;
76+ wrapper.func = fun;
77+ return wrapper;
78+}
79+
80+function A2(fun,a,b) {
81+ return fun.arity === 2 ? fun.func(a,b) : fun(a)(b);
82+}
83+function A3(fun,a,b,c) {
84+ return fun.arity === 3 ? fun.func(a,b,c) : fun(a)(b)(c);
85+}
86+function A4(fun,a,b,c,d) {
87+ return fun.arity === 4 ? fun.func(a,b,c,d) : fun(a)(b)(c)(d);
88+}
89+function A5(fun,a,b,c,d,e) {
90+ return fun.arity === 5 ? fun.func(a,b,c,d,e) : fun(a)(b)(c)(d)(e);
91+}
92+function A6(fun,a,b,c,d,e,f) {
93+ return fun.arity === 6 ? fun.func(a,b,c,d,e,f) : fun(a)(b)(c)(d)(e)(f);
94+}
95+function A7(fun,a,b,c,d,e,f,g) {
96+ return fun.arity === 7 ? fun.func(a,b,c,d,e,f,g) : fun(a)(b)(c)(d)(e)(f)(g);
97+}
98+function A8(fun,a,b,c,d,e,f,g,h) {
99+ return fun.arity === 8 ? fun.func(a,b,c,d,e,f,g,h) : fun(a)(b)(c)(d)(e)(f)(g)(h);
100+}
101+function A9(fun,a,b,c,d,e,f,g,h,i) {
102+ return fun.arity === 9 ? fun.func(a,b,c,d,e,f,g,h,i)
103+ : fun(a)(b)(c)(d)(e)(f)(g)(h)(i);
104+}
core/Native/List.js+58−72
@@ -1,5 +1,7 @@
11 /**
22 module Native.List where
3+
4+import Native.Function
35 **/
46
57(function() {
@@ -65,79 +67,68 @@
6567 return out;
6668 }
6769
68− function map(f) { return function(xs) {
70+ function map(f, xs) {
6971 var arr = [];
7072 while (xs.ctor === "Cons") {
7173 arr.push(f(xs._0));
7274 xs = xs._1;
7375 }
7476 return fromArray(arr);
75− }
7677 }
7778
78− function foldl(f) { return function(b) { return function(xs) {
79− var acc = b;
80− while (xs.ctor === "Cons") {
81− acc = f(xs._0)(acc);
82− xs = xs._1;
83− }
84− return acc;
79+ function foldl(f, b, xs) {
80+ var acc = b;
81+ while (xs.ctor === "Cons") {
82+ acc = f(xs._0)(acc);
83+ xs = xs._1;
8584 }
86− }
85+ return acc;
8786 }
8887
89− function foldr(f) { return function(b) { return function(xs) {
90− var arr = toArray(xs);
91− var acc = b;
92− for (var i = arr.length; i--; ) {
93− acc = f(arr[i])(acc);
94− }
95− return acc;
88+ function foldr(f, b, xs) {
89+ var arr = toArray(xs);
90+ var acc = b;
91+ for (var i = arr.length; i--; ) {
92+ acc = f(arr[i])(acc);
9693 }
97− }
94+ return acc;
9895 }
9996
100− function foldl1(f) { return function(xs) {
101− xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f)(xs._0)(xs._1);
102− }
97+ function foldl1(f, xs) {
98+ xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f, xs._0, xs._1);
10399 }
104100
105− function foldr1(f) { return function(xs) {
101+ function foldr1(f, xs) {
106102 if (xs.ctor === "Nil") { throwError('foldr1'); }
107103 var arr = toArray(xs);
108104 var acc = arr.pop();
109105 for (var i = arr.length; i--; ) {
110− acc = f(arr[i])(acc);
106+ acc = A2(f, arr[i], acc);
111107 }
112108 return acc;
113− }
114109 }
115110
116− function scanl(f) { return function(b) { return function(xs) {
117− var arr = toArray(xs);
118− arr.unshift(b);
119− var len = arr.length;
120− for (var i = 1; i < len; ++i) {
121− arr[i] = f(arr[i])(arr[i-1]);
122− }
123− return fromArray(arr);
111+ function scanl(f, b, xs) {
112+ var arr = toArray(xs);
113+ arr.unshift(b);
114+ var len = arr.length;
115+ for (var i = 1; i < len; ++i) {
116+ arr[i] = A2(f, arr[i], arr[i-1]);
124117 }
125− }
118+ return fromArray(arr);
126119 }
127120
128− function scanl1(f) { return function(xs) {
129− xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f)(xs._0)(xs._1);
130− }
121+ function scanl1(f, xs) {
122+ xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f, xs._0, xs._1);
131123 }
132124
133− function filter(pred) { return function(xs) {
125+ function filter(pred, xs) {
134126 var arr = [];
135127 while (xs.ctor === "Cons") {
136128 if (pred(xs._0)) { arr.push(xs._0); }
137129 xs = xs._1;
138130 }
139131 return fromArray(arr);
140− }
141132 }
142133
143134 function length(xs) {
@@ -151,52 +142,47 @@
151142
152143 function reverse(xs) { return fromArray(toArray(xs).reverse()); }
153144
154− function all(pred) { return function(xs) {
145+ function all(pred, xs) {
155146 while (xs.ctor === "Cons") {
156147 if (!pred(xs._0)) return false;
157148 xs = xs._1;
158149 }
159150 return true;
160− }
161151 }
162152
163− function any(pred) { return function(xs) {
153+ function any(pred, xs) {
164154 while (xs.ctor === "Cons") {
165155 if (pred(xs._0)) return true;
166156 xs = xs._1;
167157 }
168158 return false;
169− }
170159 }
171160
172− function zipWith(f) { return function(xs) { return function(ys) {
173− var arr = [];
174− while (xs.ctor === "Cons" && ys.ctor === "Cons") {
175− arr.push(f(xs._0)(ys._0));
176− xs = xs._1;
177− ys = ys._1;
178− }
179− return fromArray(arr);
161+ function zipWith(f, xs, ys) {
162+ var arr = [];
163+ while (xs.ctor === "Cons" && ys.ctor === "Cons") {
164+ arr.push(A2(f, xs._0, ys._0));
165+ xs = xs._1;
166+ ys = ys._1;
180167 }
181− }
168+ return fromArray(arr);
182169 }
183170
184− function zip(xs) { return function(ys) {
171+ function zip(xs, ys) {
185172 var arr = [];
186173 while (xs.ctor === "Cons" && ys.ctor === "Cons") {
187− arr.push(["Tuple2",xs._0,ys._0]);
174+ arr.push({ ctor:'Tuple2', _0:xs._0, _1:ys._0 });
188175 xs = xs._1;
189176 ys = ys._1;
190177 }
191178 return fromArray(arr);
192− }
193179 }
194180
195181 function sort(xs) {
196182 return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
197183 }
198184
199− function take(n) { return function(xs) {
185+ function take(n, xs) {
200186 var arr = [];
201187 while (xs.ctor === "Cons" && n > 0) {
202188 arr.push(xs._0);
@@ -204,16 +190,14 @@
204190 --n;
205191 }
206192 return fromArray(arr);
207− }
208193 }
209194
210− function drop(n) { return function(xs) {
195+ function drop(n, xs) {
211196 while (xs.ctor === "Cons" && n > 0) {
212197 xs = xs._1;
213198 --n;
214199 }
215200 return xs;
216− }
217201 }
218202
219203 Elm.Native.List = {
@@ -228,23 +212,25 @@
228212 tail:tail,
229213 last:last,
230214
231− map:map,
232− foldl:foldl,
233− foldr:foldr,
215+ map:F2(map),
216+ foldl:F3(foldl),
217+ foldr:F3(foldr),
234218
235− foldl1:foldl1,
236− foldr1:foldr1,
237− scanl:scanl,
238− scanl1:scanl1,
239− filter:filter,
219+ foldl1:F2(foldl1),
220+ foldr1:F2(foldr1),
221+ scanl:F3(scanl),
222+ scanl1:F2(scanl1),
223+ filter:F2(filter),
240224 length:length,
241225 reverse:reverse,
242226
243− all:all,
244− any:any,
245− zipWith:zipWith,
246− zip:zip,
227+ all:F2(all),
228+ any:F2(any),
229+ zipWith:F3(zipWith),
230+ zip:F2(zip),
247231 sort:sort,
248− take:take,
249− drop:drop};
232+ take:F2(take),
233+ drop:F2(drop)
234+ };
235+
250236}());