"use strict"; const Promise = require("bluebird"); const memoizee = require("memoizee"); // FIXME: Figure out a reasonable way to make this symbol its own (conflict-free) package, given that it'll be used all across both sysquery and CVM const All = require("../graphql-interface/symbols/all"); // This generates a (memoized) source function for commands that always produce an entire list, that needs to be filtered for the desired item(s) module.exports = function evaluateAndPick({ command, selectResult, selectID, many }) { let commandOnce = memoizee(command); return function (ids) { return Promise.try(() => { return commandOnce(); }).then((result) => { if (selectResult != null) { return selectResult(result); } else { return result; } }).then((items) => { return ids.map((id) => { if (id === All) { return items; } else if (many === true) { // NOTE: This produces nested arrays! One array for each input ID. return items.filter((item) => selectID(item) === id); } else { // TODO: Can this be more performant? Currently it is a nested loop return items.find((item) => selectID(item) === id); } }); }); }; };