Add the native function module and transform the list library to use it.
This commit is contained in:
parent
c5519e3046
commit
9eddb7a3bd
2 changed files with 165 additions and 75 deletions
104
core/Native/Function.js
Normal file
104
core/Native/Function.js
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
module Native.Function where
|
||||
*/
|
||||
|
||||
function F2(fun) {
|
||||
function wrapper(a) { return function(b) { return fun(a,b) } }
|
||||
wrapper.arity = 2;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F3(fun) {
|
||||
function wrapper(a) {
|
||||
return function(b) { return function(c) { return fun(a,b,c) }}
|
||||
}
|
||||
wrapper.arity = 3;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F4(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return fun(a,b,c,d) }}}
|
||||
}
|
||||
wrapper.arity = 4;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F5(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return function(e) { return fun(a,b,c,d,e) }}}}
|
||||
}
|
||||
wrapper.arity = 5;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F6(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return function(e) { return function(f) {
|
||||
return fun(a,b,c,d,e,f) }}}}}
|
||||
}
|
||||
wrapper.arity = 6;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F7(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return function(e) { return function(f) {
|
||||
return function(g) { return fun(a,b,c,d,e,f,g) }}}}}}
|
||||
}
|
||||
wrapper.arity = 7;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F8(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return function(e) { return function(f) {
|
||||
return function(g) { return function(h) {return fun(a,b,c,d,e,f,g,h)}}}}}}}
|
||||
}
|
||||
wrapper.arity = 8;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function F9(fun) {
|
||||
function wrapper(a) { return function(b) { return function(c) {
|
||||
return function(d) { return function(e) { return function(f) {
|
||||
return function(g) { return function(h) { return function(i) {
|
||||
return fun(a,b,c,d,e,f,g,h,i) }}}}}}}}
|
||||
}
|
||||
wrapper.arity = 9;
|
||||
wrapper.func = fun;
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function A2(fun,a,b) {
|
||||
return fun.arity === 2 ? fun.func(a,b) : fun(a)(b);
|
||||
}
|
||||
function A3(fun,a,b,c) {
|
||||
return fun.arity === 3 ? fun.func(a,b,c) : fun(a)(b)(c);
|
||||
}
|
||||
function A4(fun,a,b,c,d) {
|
||||
return fun.arity === 4 ? fun.func(a,b,c,d) : fun(a)(b)(c)(d);
|
||||
}
|
||||
function A5(fun,a,b,c,d,e) {
|
||||
return fun.arity === 5 ? fun.func(a,b,c,d,e) : fun(a)(b)(c)(d)(e);
|
||||
}
|
||||
function A6(fun,a,b,c,d,e,f) {
|
||||
return fun.arity === 6 ? fun.func(a,b,c,d,e,f) : fun(a)(b)(c)(d)(e)(f);
|
||||
}
|
||||
function A7(fun,a,b,c,d,e,f,g) {
|
||||
return fun.arity === 7 ? fun.func(a,b,c,d,e,f,g) : fun(a)(b)(c)(d)(e)(f)(g);
|
||||
}
|
||||
function A8(fun,a,b,c,d,e,f,g,h) {
|
||||
return fun.arity === 8 ? fun.func(a,b,c,d,e,f,g,h) : fun(a)(b)(c)(d)(e)(f)(g)(h);
|
||||
}
|
||||
function A9(fun,a,b,c,d,e,f,g,h,i) {
|
||||
return fun.arity === 9 ? fun.func(a,b,c,d,e,f,g,h,i)
|
||||
: fun(a)(b)(c)(d)(e)(f)(g)(h)(i);
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
/**
|
||||
module Native.List where
|
||||
|
||||
import Native.Function
|
||||
**/
|
||||
|
||||
(function() {
|
||||
|
@ -65,79 +67,68 @@
|
|||
return out;
|
||||
}
|
||||
|
||||
function map(f) { return function(xs) {
|
||||
function map(f, xs) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons") {
|
||||
arr.push(f(xs._0));
|
||||
xs = xs._1;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
}
|
||||
|
||||
function foldl(f) { return function(b) { return function(xs) {
|
||||
var acc = b;
|
||||
while (xs.ctor === "Cons") {
|
||||
acc = f(xs._0)(acc);
|
||||
xs = xs._1;
|
||||
}
|
||||
return acc;
|
||||
function foldl(f, b, xs) {
|
||||
var acc = b;
|
||||
while (xs.ctor === "Cons") {
|
||||
acc = f(xs._0)(acc);
|
||||
xs = xs._1;
|
||||
}
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
|
||||
function foldr(f) { return function(b) { return function(xs) {
|
||||
var arr = toArray(xs);
|
||||
var acc = b;
|
||||
for (var i = arr.length; i--; ) {
|
||||
acc = f(arr[i])(acc);
|
||||
}
|
||||
return acc;
|
||||
function foldr(f, b, xs) {
|
||||
var arr = toArray(xs);
|
||||
var acc = b;
|
||||
for (var i = arr.length; i--; ) {
|
||||
acc = f(arr[i])(acc);
|
||||
}
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
|
||||
function foldl1(f) { return function(xs) {
|
||||
xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f)(xs._0)(xs._1);
|
||||
}
|
||||
function foldl1(f, xs) {
|
||||
xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f, xs._0, xs._1);
|
||||
}
|
||||
|
||||
function foldr1(f) { return function(xs) {
|
||||
function foldr1(f, xs) {
|
||||
if (xs.ctor === "Nil") { throwError('foldr1'); }
|
||||
var arr = toArray(xs);
|
||||
var acc = arr.pop();
|
||||
for (var i = arr.length; i--; ) {
|
||||
acc = f(arr[i])(acc);
|
||||
acc = A2(f, arr[i], acc);
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
|
||||
function scanl(f) { return function(b) { return function(xs) {
|
||||
var arr = toArray(xs);
|
||||
arr.unshift(b);
|
||||
var len = arr.length;
|
||||
for (var i = 1; i < len; ++i) {
|
||||
arr[i] = f(arr[i])(arr[i-1]);
|
||||
}
|
||||
return fromArray(arr);
|
||||
function scanl(f, b, xs) {
|
||||
var arr = toArray(xs);
|
||||
arr.unshift(b);
|
||||
var len = arr.length;
|
||||
for (var i = 1; i < len; ++i) {
|
||||
arr[i] = A2(f, arr[i], arr[i-1]);
|
||||
}
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
|
||||
function scanl1(f) { return function(xs) {
|
||||
xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f)(xs._0)(xs._1);
|
||||
}
|
||||
function scanl1(f, xs) {
|
||||
xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f, xs._0, xs._1);
|
||||
}
|
||||
|
||||
function filter(pred) { return function(xs) {
|
||||
function filter(pred, xs) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons") {
|
||||
if (pred(xs._0)) { arr.push(xs._0); }
|
||||
xs = xs._1;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
}
|
||||
|
||||
function length(xs) {
|
||||
|
@ -151,52 +142,47 @@
|
|||
|
||||
function reverse(xs) { return fromArray(toArray(xs).reverse()); }
|
||||
|
||||
function all(pred) { return function(xs) {
|
||||
function all(pred, xs) {
|
||||
while (xs.ctor === "Cons") {
|
||||
if (!pred(xs._0)) return false;
|
||||
xs = xs._1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function any(pred) { return function(xs) {
|
||||
function any(pred, xs) {
|
||||
while (xs.ctor === "Cons") {
|
||||
if (pred(xs._0)) return true;
|
||||
xs = xs._1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function zipWith(f) { return function(xs) { return function(ys) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons" && ys.ctor === "Cons") {
|
||||
arr.push(f(xs._0)(ys._0));
|
||||
xs = xs._1;
|
||||
ys = ys._1;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function zip(xs) { return function(ys) {
|
||||
function zipWith(f, xs, ys) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons" && ys.ctor === "Cons") {
|
||||
arr.push(["Tuple2",xs._0,ys._0]);
|
||||
arr.push(A2(f, xs._0, ys._0));
|
||||
xs = xs._1;
|
||||
ys = ys._1;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
|
||||
function zip(xs, ys) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons" && ys.ctor === "Cons") {
|
||||
arr.push({ ctor:'Tuple2', _0:xs._0, _1:ys._0 });
|
||||
xs = xs._1;
|
||||
ys = ys._1;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
}
|
||||
|
||||
function sort(xs) {
|
||||
return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
|
||||
}
|
||||
|
||||
function take(n) { return function(xs) {
|
||||
function take(n, xs) {
|
||||
var arr = [];
|
||||
while (xs.ctor === "Cons" && n > 0) {
|
||||
arr.push(xs._0);
|
||||
|
@ -204,16 +190,14 @@
|
|||
--n;
|
||||
}
|
||||
return fromArray(arr);
|
||||
}
|
||||
}
|
||||
|
||||
function drop(n) { return function(xs) {
|
||||
function drop(n, xs) {
|
||||
while (xs.ctor === "Cons" && n > 0) {
|
||||
xs = xs._1;
|
||||
--n;
|
||||
}
|
||||
return xs;
|
||||
}
|
||||
}
|
||||
|
||||
Elm.Native.List = {
|
||||
|
@ -228,23 +212,25 @@
|
|||
tail:tail,
|
||||
last:last,
|
||||
|
||||
map:map,
|
||||
foldl:foldl,
|
||||
foldr:foldr,
|
||||
map:F2(map),
|
||||
foldl:F3(foldl),
|
||||
foldr:F3(foldr),
|
||||
|
||||
foldl1:foldl1,
|
||||
foldr1:foldr1,
|
||||
scanl:scanl,
|
||||
scanl1:scanl1,
|
||||
filter:filter,
|
||||
foldl1:F2(foldl1),
|
||||
foldr1:F2(foldr1),
|
||||
scanl:F3(scanl),
|
||||
scanl1:F2(scanl1),
|
||||
filter:F2(filter),
|
||||
length:length,
|
||||
reverse:reverse,
|
||||
|
||||
all:all,
|
||||
any:any,
|
||||
zipWith:zipWith,
|
||||
zip:zip,
|
||||
all:F2(all),
|
||||
any:F2(any),
|
||||
zipWith:F3(zipWith),
|
||||
zip:F2(zip),
|
||||
sort:sort,
|
||||
take:take,
|
||||
drop:drop};
|
||||
take:F2(take),
|
||||
drop:F2(drop)
|
||||
};
|
||||
|
||||
}());
|
Loading…
Reference in a new issue