UNPKG

haskellstream

Version:

Small library to provide functional programming paradigms.

138 lines (116 loc) 2.54 kB
var curry = require('./core').curry var flip = require('./core').flip var add = require('./base').add var multiply = require('./base').multiply var max = require('./base').max var min = require('./base').min var length = function(xs) { return xs.length } exports.length = length var empty = function(xs) { return xs.length === 0 } exports.empty = empty var head = function(xs) { return xs[0] } exports.head = head var last = function(xs) { return xs[xs.length - 1] } exports.last = last var init = function(xs) { return xs.slice(0, xs.length - 1) } exports.init = init var tail = function(xs) { return xs.slice(1) } exports.tail = tail var index = curry(function(xs, i) { return xs[i] }) exports.index = index var cons = curry(function(x, xs) { return [x].concat(xs) }) exports.cons = cons var reduce = curry(function(fn, acc, xs) { if (empty(xs)) { return acc } else { return fn(head(xs), reduce(fn, acc, tail(xs))) } }) exports.reduce = reduce var sum = reduce(add, 0) exports.sum = sum var product = reduce(multiply, 1) exports.product = product var append = curry(function(a, b) { return reduce(cons, b, a) }) exports.append = append var concat = reduce(append, []) exports.concat = concat var range = curry(function(from, to) { from = Math.floor(from) to = Math.floor(to) if (from < to) { return cons(from, range(from + 1, to)) } if (from > to) { return cons(from, range(from - 1, to)) } return [from] }) exports.range = range var filter = curry(function(criteria, list) { if (empty(list)) { return list } else { var x = head(list) var xs = tail(list) if (criteria(x)) { return cons(x, filter(criteria, xs)) } else { return filter(criteria, xs) } } }) exports.filter = filter var foldl = curry(function(fn, acc, list) { if (empty(list)) { return acc } else { var x = head(list) var xs = tail(list) return foldl(fn, fn(acc, x), xs) } }) exports.foldl = foldl var reverse = foldl(flip(cons), []) exports.reverse = reverse var take = curry(function(n, list) { if (n <= 0 || empty(list)) { return [] } else { var x = head(list) var xs = tail(list) return cons(x, take(n-1, xs)) } }) exports.take = take var drop = curry(function(n, list) { if (n <= 0 || empty(list)) { return list } else { return drop(n-1, tail(list)) } }) exports.drop = drop var maximum = reduce(max, -Infinity) exports.maximum = maximum var minimum = reduce(min, Infinity) exports.minimum = minimum