var own = {}.hasOwnProperty /** * @callback Handler * @param {...unknown} value * @return {unknown} * * @typedef {Record} Handlers * * @typedef {Object} Options * @property {Handler} [unknown] * @property {Handler} [invalid] * @property {Handlers} [handlers] */ /** * Handle values based on a property. * * @param {string} key * @param {Options} [options] */ export function zwitch(key, options) { var settings = options || {} /** * Handle one value. * Based on the bound `key`, a respective handler will be called. * If `value` is not an object, or doesn’t have a `key` property, the special * “invalid” handler will be called. * If `value` has an unknown `key`, the special “unknown” handler will be * called. * * All arguments, and the context object, are passed through to the handler, * and it’s result is returned. * * @param {...unknown} [value] * @this {unknown} * @returns {unknown} * @property {Handler} invalid * @property {Handler} unknown * @property {Handlers} handlers */ function one(value) { var fn = one.invalid var handlers = one.handlers if (value && own.call(value, key)) { fn = own.call(handlers, value[key]) ? handlers[value[key]] : one.unknown } if (fn) { return fn.apply(this, arguments) } } one.handlers = settings.handlers || {} one.invalid = settings.invalid one.unknown = settings.unknown return one }