Skip to content

Instantly share code, notes, and snippets.

@mlebkowski
Forked from sjl/list-out-of-lambda.js
Last active December 19, 2015 21:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mlebkowski/6018998 to your computer and use it in GitHub Desktop.
Save mlebkowski/6018998 to your computer and use it in GitHub Desktop.
"use strict";
var empty_list = function (selector) {
return selector(undefined, undefined, true);
};
var prepend = function (el, list) {
return function (selector) {
return selector(el, list, false);
}
}
var head = function (list) {
return list(function (head, tail, e) {
return head;
});
}
var tail = function (list) {
return list(function (head, tail, e) {
return tail;
});
}
var is_empty = function (list) {
return list(function(head, tail, empty) {
return empty;
});
}
var map = function(fn, list) {
if (is_empty(list)) {
return empty_list;
} else {
return prepend(fn(head(list)), map(fn, tail(list)));
}
}
var filter = function(fn, list) {
if (is_empty(list)) {
return empty_list;
} else if (fn(head(list))) {
return prepend(head(list), filter(fn, tail(list)));
} else {
return filter(fn, tail(list));
}
}
var not = function(x) {
if (x) {
return false;
} else {
return true;
}
}
var and = function(a, b) {
if (a) {
if (b) {
return true;
} else {
return false;
}
} else {
return false;
}
}
var or = function(a, b) {
if (a) {
return true;
} else {
if (b) {
return true;
} else {
return false;
}
}
}
var inc = function(number) {
return prepend(empty_list, number);
};
var dec = function(number) {
return tail(number);
};
var is_zero = function(n) {
return is_empty(n);
};
var add = function(a, b) {
if (is_zero(b)) {
return a;
} else {
return add(inc(a), dec(b));
}
};
var sub = function(a, b) {
if (is_zero(b)) {
return a;
} else {
return sub(dec(a), dec(b));
}
};
var mul = function(a, b) {
if (is_zero(b)) {
return zero;
} else {
return add(a, mul(a, dec(b)));
}
};
var pow = function(a, b) {
if (is_zero(b)) {
return one;
} else {
return mul(a, pow(a, dec(b)));
}
};
var is_equal = function(n, m) {
if (and(is_zero(n), is_zero(m))) {
return true;
} else if (or(is_zero(n), is_zero(m))) {
return false;
} else {
return is_equal(dec(n), dec(m));
}
};
var less_than = function(a, b) {
if (and(is_zero(a), is_zero(b))) {
return false;
} else if (is_zero(a)) {
return true;
} else if (is_zero(b)) {
return false;
} else {
return less_than(dec(a), dec(b));
}
};
var greater_than = function(a, b) {
return less_than(b, a);
};
var div = function(a, b) {
if (less_than(a, b)) {
return zero;
} else {
return inc(div(sub(a, b), b));
}
};
var rem = function(a, b) {
if (less_than(a, b)) {
return a;
} else {
return rem(sub(a, b), b);
}
};
var nth = function(list, number) {
if (is_zero(number)) {
return head(list);
} else {
return nth(tail(list), dec(number));
}
};
var drop = function(list, number) {
if (is_zero(number)) {
return list;
} else {
return drop(tail(list), dec(number));
}
};
var take = function(list, number) {
if (is_zero(number)) {
return empty_list;
} else {
return prepend(head(list), take(tail(list), dec(number)));
}
};
var slice = function(list, start, end) {
return take(drop(list, start), sub(end, start));
};
var zero = empty_list;
var length = function(list) {
if (is_empty(list)) {
return zero;
} else {
return inc(length(tail(list)));
}
};
var concat = function(a, b) {
if(is_empty(a)) {
return b;
}
return concat(take(a, dec(length(a))), prepend(head(drop(a, dec(length(a)))), b));
};
var append = function (el, list) {
if (is_empty(list)) {
return prepend(el, list);
}
return concat(list, prepend(el, empty_list));
}
var max = function (a, b) {
if (greater_than(a, b)) {
return a;
}
return b;
}
var min = function (a, b) {
if (less_than(a,b)) {
return a;
}
return b;
};
var remove = function (list) {
return filter(function (el) { return el; }, list);
}
var contains_number = function (number, list) {
if (is_empty(list)) {
return false;
} else if (is_equal(number, head(list))) {
return true;
} else {
return contains_number(number, tail(list));
}
}
var dump = function (list) {
var arr = [];
while (false === is_empty(list)) {
arr.push(head(list));
list = tail(list);
}
console.log(arr);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment