2013-02-22 23:19:40 +00:00
|
|
|
(function() {
|
2013-02-20 22:39:00 +00:00
|
|
|
"use strict";
|
2013-02-10 04:40:23 +00:00
|
|
|
|
2013-02-21 23:33:53 +00:00
|
|
|
var Nil = { ctor:'Nil' };
|
|
|
|
function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
|
|
|
|
|
2013-02-10 09:45:45 +00:00
|
|
|
function throwError(f) {
|
|
|
|
throw new Error("Function '" + f + "' expects a non-empty list!");
|
|
|
|
}
|
2013-02-10 04:40:23 +00:00
|
|
|
|
2013-02-10 09:45:45 +00:00
|
|
|
function toArray(xs) {
|
|
|
|
var out = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
out.push(xs._0);
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
function fromArray(arr) {
|
2013-02-21 23:33:53 +00:00
|
|
|
var out = Nil;
|
2013-02-10 09:45:45 +00:00
|
|
|
for (var i = arr.length; i--; ) {
|
2013-02-21 23:33:53 +00:00
|
|
|
out = Cons(arr[i], out);
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
2013-02-20 22:39:00 +00:00
|
|
|
function head(v) { v.ctor === "Nil" ? throwError('head') : return v._0; }
|
|
|
|
function tail(v) { v.ctor === "Nil" ? throwError('tail') : return v._1; }
|
2013-02-10 09:45:45 +00:00
|
|
|
|
|
|
|
function last(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
if (xs.ctor === "Nil") { throwError('last'); }
|
|
|
|
var out = xs._0;
|
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
out = xs._0;
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
function map(f) { return function(xs) {
|
|
|
|
var arr = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
arr.push(f(xs._0));
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return fromArray(arr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function foldl(f) { return function(b) { return function(xs) {
|
|
|
|
var acc = b;
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
acc = f(xs._0)(acc);
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
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 foldl1(f) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
xs.ctor === "Nil" ? throwError('foldl1') : return foldl(f)(xs._0)(xs._1);
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function foldr1(f) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
if (xs.ctor === "Nil") { throwError('foldr1'); }
|
2013-02-10 09:45:45 +00:00
|
|
|
var arr = toArray(xs);
|
|
|
|
var acc = arr.pop();
|
|
|
|
for (var i = arr.length; i--; ) {
|
|
|
|
acc = 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 scanl1(f) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
xs.ctor === "Nil" ? throwError('scanl1') : return scanl(f)(xs._0)(xs._1);
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function filter(pred) { return function(xs) {
|
|
|
|
var arr = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
if (pred(xs._0)) { arr.push(xs._0); }
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return fromArray(arr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function length(xs) {
|
|
|
|
var out = 0;
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
2013-02-10 09:45:45 +00:00
|
|
|
out += 1;
|
2013-02-20 22:39:00 +00:00
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
|
|
|
|
function reverse(xs) { return fromArray(toArray(xs).reverse()); }
|
|
|
|
|
|
|
|
function all(pred) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
if (!pred(xs._0)) return false;
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function any(pred) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons") {
|
|
|
|
if (pred(xs._0)) return true;
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function zipWith(f) { return function(xs) { return function(ys) {
|
|
|
|
var arr = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons" && ys.ctor === "Cons") {
|
|
|
|
arr.push(f(xs._0)(ys._0));
|
|
|
|
xs = xs._1;
|
|
|
|
ys = ys._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return fromArray(arr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function zip(xs) { return function(ys) {
|
|
|
|
var arr = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons" && ys.ctor === "Cons") {
|
|
|
|
arr.push(["Tuple2",xs._0,ys._0]);
|
|
|
|
xs = xs._1;
|
|
|
|
ys = ys._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
}
|
|
|
|
return fromArray(arr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function sort(xs) {
|
|
|
|
return fromArray(toArray(xs).sort(function(a,b) { return a - b}));
|
|
|
|
}
|
|
|
|
|
|
|
|
function take(n) { return function(xs) {
|
|
|
|
var arr = [];
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons" && n > 0) {
|
|
|
|
arr.push(xs._0);
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
--n;
|
|
|
|
}
|
|
|
|
return fromArray(arr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function drop(n) { return function(xs) {
|
2013-02-20 22:39:00 +00:00
|
|
|
while (xs.ctor === "Cons" && n > 0) {
|
|
|
|
xs = xs._1;
|
2013-02-10 09:45:45 +00:00
|
|
|
--n;
|
|
|
|
}
|
|
|
|
return xs;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-21 23:33:53 +00:00
|
|
|
Elm.Native.List = {
|
2013-02-10 09:45:45 +00:00
|
|
|
head:head,
|
|
|
|
tail:tail,
|
|
|
|
last:last,
|
|
|
|
|
|
|
|
map:map,
|
|
|
|
foldl:foldl,
|
|
|
|
foldr:foldr,
|
|
|
|
|
|
|
|
foldl1:foldl1,
|
|
|
|
foldr1:foldr1,
|
|
|
|
scanl:scanl,
|
|
|
|
scanl1:scanl1,
|
|
|
|
filter:filter,
|
|
|
|
length:length,
|
|
|
|
reverse:reverse,
|
|
|
|
|
|
|
|
all:all,
|
|
|
|
any:any,
|
|
|
|
zipWith:zipWith,
|
|
|
|
zip:zip,
|
|
|
|
sort:sort,
|
|
|
|
take:take,
|
|
|
|
drop:drop};
|
2013-02-22 23:19:40 +00:00
|
|
|
}());
|