mirror of https://github.com/codefeathers/fuse
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							190 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							190 lines
						
					
					
						
							4.9 KiB
						
					
					
				| <!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>
 | |
| 
 |