UNPKG

2.93 kBJavaScriptView Raw
1/** @license MIT License (c) copyright 2011-2013 original author or authors */
2
3/**
4 * Licensed under the MIT License at:
5 * http://www.opensource.org/licenses/mit-license.php
6 *
7 * @author Brian Cavalier
8 * @author John Hann
9 */
10(function(define) { 'use strict';
11define(function(require) {
12
13 var when = require('./when');
14 var Promise = when.Promise;
15 var toPromise = when.resolve;
16
17 return {
18 all: when.lift(all),
19 map: map,
20 settle: settle
21 };
22
23 /**
24 * Resolve all the key-value pairs in the supplied object or promise
25 * for an object.
26 * @param {Promise|object} object or promise for object whose key-value pairs
27 * will be resolved
28 * @returns {Promise} promise for an object with the fully resolved key-value pairs
29 */
30 function all(object) {
31 var p = Promise._defer();
32 var resolver = Promise._handler(p);
33
34 var results = {};
35 var keys = Object.keys(object);
36 var pending = keys.length;
37
38 for(var i=0, k; i<keys.length; ++i) {
39 k = keys[i];
40 Promise._handler(object[k]).fold(settleKey, k, results, resolver);
41 }
42
43 if(pending === 0) {
44 resolver.resolve(results);
45 }
46
47 return p;
48
49 function settleKey(k, x, resolver) {
50 /*jshint validthis:true*/
51 this[k] = x;
52 if(--pending === 0) {
53 resolver.resolve(results);
54 }
55 }
56 }
57
58 /**
59 * Map values in the supplied object's keys
60 * @param {Promise|object} object or promise for object whose key-value pairs
61 * will be reduced
62 * @param {function(value:*, key:String):*} f mapping function which may
63 * return either a promise or a value
64 * @returns {Promise} promise for an object with the mapped and fully
65 * resolved key-value pairs
66 */
67 function map(object, f) {
68 return toPromise(object).then(function(object) {
69 return all(Object.keys(object).reduce(function(o, k) {
70 o[k] = toPromise(object[k]).fold(mapWithKey, k);
71 return o;
72 }, {}));
73 });
74
75 function mapWithKey(k, x) {
76 return f(x, k);
77 }
78 }
79
80 /**
81 * Resolve all key-value pairs in the supplied object and return a promise
82 * that will always fulfill with the outcome states of all input promises.
83 * @param {object} object whose key-value pairs will be settled
84 * @returns {Promise} promise for an object with the mapped and fully
85 * settled key-value pairs
86 */
87 function settle(object) {
88 var keys = Object.keys(object);
89 var results = {};
90
91 if(keys.length === 0) {
92 return toPromise(results);
93 }
94
95 var p = Promise._defer();
96 var resolver = Promise._handler(p);
97 var promises = keys.map(function(k) { return object[k]; });
98
99 when.settle(promises).then(function(states) {
100 populateResults(keys, states, results, resolver);
101 });
102
103 return p;
104 }
105
106 function populateResults(keys, states, results, resolver) {
107 for(var i=0; i<keys.length; i++) {
108 results[keys[i]] = states[i];
109 }
110 resolver.resolve(results);
111 }
112
113});
114})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });