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) );