UNPKG

nanoscope

Version:

A Lens Library for Javascript

151 lines (112 loc) 4.29 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: combinator/MultiLens.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: combinator/MultiLens.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>"use strict"; var _ = require('lodash'), Lens = require('./../Lens'), get, map, MultiLens; get = function (lenses) { return function (obj) { var gets; if (_.isArray(lenses)) { gets = []; _.forEach(lenses, function (lens) { gets.push(lens.get(obj)); }); } else { if (_.isObject(lenses)) { gets = {}; _.forEach(_.keys(lenses), function (key) { gets[key] = lenses[key].get(obj); }); } } return gets; }; }; map = function (lenses) { return function (obj, func) { var newObj = _.cloneDeep(obj); if (_.isArray(lenses)) { _.forEach(lenses, function (lens) { newObj = lens.map(newObj, func); }); } else { if (_.isObject(lenses)) { _.forEach(_.values(lenses), function (lens) { newObj = lens.map(newObj, func); }); } } return newObj; }; }; /** * A `MultiLens` is a `Lens` that can view on multiple things at once. It takes * an array of `Lens`es or an object with `Lens`es as values; `get`, `set` and `map` * run corresponding functions over the input object for each internal lens. * * @param {object|Array} lenses Lenses used to view on input objects. * @param {object} flags Additional flags to add to the Lens instance * @returns {MultiLens} * @constructor */ MultiLens = function (lenses, flags) { flags = flags || {}; // Guard against no 'new' if (!this instanceof MultiLens) { return new MultiLens(lenses, flags); } flags._multi = true; if (_.isObject(lenses)) { _.forEach(_.keys(lenses), function (key) { if (!((lenses[key] instanceof Lens) || (lenses[key] instanceof MultiLens))) { throw new Error('Cannot construct MultiLens from non-lens'); } }); this._lenses = lenses; } if (_.isArray(lenses)) { _.forEach(lenses, function (lens) { if (!((lens instanceof Lens) || (lens instanceof MultiLens))) { throw new Error('Cannot construct MultiLens from non-lens'); } }); this._lenses = lenses; } this.base = Lens; this.base(get(lenses), map(lenses), flags); }; MultiLens.prototype = new Lens; module.exports = MultiLens;</code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Compose.html">Compose</a></li><li><a href="Getter.html">Getter</a></li><li><a href="IndexedLens.html">IndexedLens</a></li><li><a href="IndexedLens.Unsafe.html">Unsafe</a></li><li><a href="Lens.html">Lens</a></li><li><a href="MultiLens.html">MultiLens</a></li><li><a href="Optional.html">Optional</a></li><li><a href="PathLens.html">PathLens</a></li><li><a href="PathLens.Unsafe.html">Unsafe</a></li><li><a href="Setter.html">Setter</a></li><li><a href="SliceLens.html">SliceLens</a></li></ul><h3>Global</h3><ul><li><a href="global.html#get">get</a></li><li><a href="global.html#IdLens">IdLens</a></li><li><a href="global.html#map">map</a></li></ul> </nav> <br clear="both"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-alpha11</a> on Wed Dec 17 2014 09:18:53 GMT-0500 (EST) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>