-
-
Save mlebkowski/6018998 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"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