35 lines
934 B
JavaScript
35 lines
934 B
JavaScript
var assert = require('./assert');
|
|
var isFunction = require('./isFunction');
|
|
var isType = require('./isType');
|
|
var Any = require('./Any');
|
|
|
|
module.exports = function match(x) {
|
|
var type, guard, f, count;
|
|
for (var i = 1, len = arguments.length; i < len; ) {
|
|
type = arguments[i];
|
|
guard = arguments[i + 1];
|
|
f = arguments[i + 2];
|
|
|
|
if (isFunction(f) && !isType(f)) {
|
|
i = i + 3;
|
|
}
|
|
else {
|
|
f = guard;
|
|
guard = Any.is;
|
|
i = i + 2;
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
count = (count || 0) + 1;
|
|
assert(isType(type), function () { return 'Invalid type in clause #' + count; });
|
|
assert(isFunction(guard), function () { return 'Invalid guard in clause #' + count; });
|
|
assert(isFunction(f), function () { return 'Invalid block in clause #' + count; });
|
|
}
|
|
|
|
if (type.is(x) && guard(x)) {
|
|
return f(x);
|
|
}
|
|
}
|
|
assert.fail('Match error');
|
|
};
|