var assert = require('./assert'); var isString = require('./isString'); var isFunction = require('./isFunction'); var forbidNewOperator = require('./forbidNewOperator'); module.exports = function irreducible(name, predicate) { if (process.env.NODE_ENV !== 'production') { assert(isString(name), function () { return 'Invalid argument name ' + assert.stringify(name) + ' supplied to irreducible(name, predicate) (expected a string)'; }); assert(isFunction(predicate), 'Invalid argument predicate ' + assert.stringify(predicate) + ' supplied to irreducible(name, predicate) (expected a function)'); } function Irreducible(value, path) { if (process.env.NODE_ENV !== 'production') { forbidNewOperator(this, Irreducible); path = path || [name]; assert(predicate(value), function () { return 'Invalid value ' + assert.stringify(value) + ' supplied to ' + path.join('/'); }); } return value; } Irreducible.meta = { kind: 'irreducible', name: name, predicate: predicate, identity: true }; Irreducible.displayName = name; Irreducible.is = predicate; return Irreducible; };