<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: Select.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: Select.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>'use strict'; /** * Return a function based on a condition. * Functional alternative to switch-case. * @projectname Select-Return * @version 1.0.0 * @author Muthu Kumar (@MKRhere) */ /** * Creates a SelectValue instance with a value and optional resolve function. * Created internally from SelectIterable constructor, and not exported. * @class SelectValue */ class SelectValue { /** * @param {any} value - the input value * @param {function} resolve - optional resolve function * @constructs SelectIterable */ constructor(value, resolve) { this.value = value; if (resolve) this.resolve = (...args) => resolve(...args, value); } /** * Default resolve prototype. Returns null when called. * Used in case a resolve is never set. * @returns {object} null * @memberof SelectValue */ resolve() { return null; } } /** * Creates a SelectIterable instance from an array. * Created internally from Select.prototype.for, and not exported. * @class SelectIterable */ class SelectIterable { /** * @param {array} values - array created from Select.prototype.for * @param {Array<function>} tests - array of { test, consequent } objects * @param {function} tests[].test - test function * @param {function} tests[].consequent - consequent function * @constructs SelectIterable */ constructor(values, tests) { this.values = values .map(x => x instanceof SelectValue ? x : new SelectValue(x) ); this.tests = tests; } /** * Accepts a test and consequent function each and returns a new * SelectIterable instance. * @param {Test} test - test callback function * @param {function} consequent - consequent callback function * @returns {SelectIterable} - an instance of SelectIterable * @memberof SelectIterable */ for(test, consequent) { /* SelectIterable.prototype.for works a little differently than Select.prototype.for, by accumulating the tests and resolving all the values when .resolve() is called */ return new SelectIterable( this.values, [ ...this.tests, { test, consequent } ] ); } resolve(...args) { /* When .resolve() is called, a resolved value is generated for each value in the array */ return this.values.map(item => { const resolver = this .tests .find(x => x.test(item.value) ? x.consequent : null); return resolver ? resolver.consequent(...args, item.value) : null; }); } } /** * Creates a new Select instance. * @class Select * @extends {SelectValue} */ class Select extends SelectValue { /** * @param {any|array} value - the value or array of values to check against * @param {function} resolve - optional resolve function * @constructs Select */ constructor(value, resolve) { super(value, resolve); this.iterable = typeof value === "object" && Symbol.iterator in value; } /** * Accepts a test and consequent function each and returns a new * Select or SelectIterable instance. * @param {function} test - test callback function * @param {function} consequent - consequent callback function * @returns {Select|SelectIterable} - Returns a SelectIterable instance * if value was array, or a Select instance otherwise * @memberof Select */ for(test, consequent) { if (this.iterable) { /* If the value passed to the constructor is an array, initialise a new SelectIterable with the array and { test, consequent } pair and return */ return new SelectIterable( Array.from(this.value), [ { test, consequent } ], ); } if (test(this.value)) return new Select(this.value, consequent); /* If the test doesn't pass, just pass the Select instance along the chain until a test passes, or .resolve() is called */ return this; } } module.exports = Select; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Select.html">Select</a></li><li><a href="SelectIterable.html">SelectIterable</a></li><li><a href="SelectValue.html">SelectValue</a></li></ul> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Tue Apr 10 2018 04:36:07 GMT+0530 (IST) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>