mirror of
https://github.com/Sevichecc/Urara-Blog.git
synced 2025-05-03 02:19:30 +08:00
61 lines
1.5 KiB
Text
61 lines
1.5 KiB
Text
var own = {}.hasOwnProperty
|
||
|
||
/**
|
||
* @callback Handler
|
||
* @param {...unknown} value
|
||
* @return {unknown}
|
||
*
|
||
* @typedef {Record<string, Handler>} 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
|
||
}
|