'use strict'; var once = require('once'); var helpers = require('./helpers'); function map(values, iterator, extensions, done) { // Allow for extensions to not be specified if (typeof extensions === 'function') { done = extensions; extensions = {}; } // Handle no callback case if (typeof done !== 'function') { done = helpers.noop; } done = once(done); // Will throw if non-object var keys = Object.keys(values); var length = keys.length; var count = length; var idx = 0; // Return the same type as passed in var results = helpers.initializeResults(values); var exts = helpers.defaultExtensions(extensions); if (length === 0) { return done(null, results); } for (idx = 0; idx < length; idx++) { var key = keys[idx]; next(key); } function next(key) { var value = values[key]; var storage = exts.create(value, key) || {}; exts.before(storage); iterator(value, key, once(handler)); function handler(err, result) { if (err) { exts.error(err, storage); return done(err, results); } exts.after(result, storage); results[key] = result; if (--count === 0) { done(err, results); } } } } module.exports = map;