From 9eddb7a3bd5c511e1b1299a6a4c0876f9fb6a04c Mon Sep 17 00:00:00 2001 From: evancz Date: Wed, 27 Feb 2013 09:46:25 -0800 Subject: [PATCH] Add the native function module and transform the list library to use it. --- core/Native/Function.js | 104 ++++++++++++++++++++++++++++++ core/Native/List.js | 136 ++++++++++++++++++---------------------- 2 files changed, 165 insertions(+), 75 deletions(-) create mode 100644 core/Native/Function.js diff --git a/core/Native/Function.js b/core/Native/Function.js new file mode 100644 index 0000000..4c7eb6c --- /dev/null +++ b/core/Native/Function.js @@ -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); +} diff --git a/core/Native/List.js b/core/Native/List.js index 802e76b..f26ec29 100644 --- a/core/Native/List.js +++ b/core/Native/List.js @@ -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) + }; + }()); \ No newline at end of file