List catamorphisms
by dimitrs_papadimitriou
HTML
<script src="https://rawgit.com/eu81273/jsfiddle-console/master/console.js"></script>
JavaScript
Array.prototype.matchWith = function (pattern) {
return this.length == 0 ?
pattern.empty() :
pattern.concat(this[0], this.slice(1));// informed decesion not to clone
}
Array.prototype.cata = function (evaluation) {
return this.matchWith({
empty: () => evaluation.empty(),
concat: (head, tail) => evaluation.concat(head,tail.cata(evaluation))
})
}
var filter = array=>predicate=>array.cata({
empty: () => [],
concat: (v, r) => predicate(v) ? [v, ...r] : [...r]
});
console.log( filter([1,2,3,4,5,6,7])(x=>x>5) );