Fluent pattern matching for CoffeeScript and JavaScript.
CoffeeScript
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
test
.gitignore
LICENSE
README.md
package.json
pattern.coffee
pattern.js

README.md

pattern-js

Fluent pattern matching for CoffeeScript and JavaScript.

Implementation of pattern-js is inspired by Functional C#.

Usage

Start with pattern() and end with matching().

Examples

Constant and Variable Pattern

CoffeeScript

pattern = require 'pattern-js'
todo = pattern()
    .value("Mon", -> go work)
    .value("Tue", -> go relax)
    .value("Thu", -> go icefishing)
    .when(
        (val) -> val is "Fri" or val is "Sat"
        (day) ->
            if day is bingoDay
                go bingo
                go dancing)
    .value("Sun", -> go church)
    .any(-> go work)
    .matching()

todo "Tue" # go relax

JavaScript

var pattern = require('pattern-js');

var work = 1,
    relax = 2,
    iceFishing = 3,
    bingo = 4,
    dancing = 5;
var bingoDay = "Fri";
var go = function(day) { console.log(day); };

var todo = pattern()
    .value("Mon", function() { go(work); })
    .value("Tue", function() { go(relax); })
    .value("Thu", function() { go(iceFishing); })
    .when(function(val) {  return val === "Fri" || val === "Sat"; },
            function(day) {
                if (day === bingoDay) {
                    go(bingo);
                    go(dancing);
                }})
    .value("Sun", function() { go(church); })
    .any(function() { go(work); })
    .matching();

todo("Fri") // usage

Matching Multiple Elements

CoffeeScript

detectZeroTuple = pattern()
    .value([0, 0], -> console.log "Both zero")
    .some(
        [0, undefined]
        (var1, var2) -> console.log "First value is 0 in (0, #{ var2 })")
    .some(
        [undefined, 0]
        (var1, var2) -> console.log "Second value is 0 in (#{ var1 }, 0)")
    .any(-> console.log "Both nonzero.")
    .matching()
detectZeroTuple 0, 0
detectZeroTuple 1, 0
detectZeroTuple 0, 10
detectZeroTuple 10, 15

JavaScript

var detectZeroTuple = pattern()
    .value([0, 0], function() { console.log("Both zero"); })
    .some([0, undefined],
            function(var1, var2) { console.log("First value is 0 in (0, " + var2 + ")"); })
    .some([, 0],
            function(var1, var2) { console.log("Second value is 0 in (" + var1 + ", 0)"); })
    .any(function() { console.log("Both nonzero."); })
    .matching();
detectZeroTuple(0, 0);
detectZeroTuple(1, 0);
detectZeroTuple(0, 10);
detectZeroTuple(10, 15);