1'use strict';
2
3//This file contains the ES6 extensions to the core Promises/A+ API
4
5var Promise = require('./core.js');
6
7module.exports = Promise;
8
9/* Static Functions */
10
11var TRUE = valuePromise(true);
12var FALSE = valuePromise(false);
13var NULL = valuePromise(null);
14var UNDEFINED = valuePromise(undefined);
15var ZERO = valuePromise(0);
16var EMPTYSTRING = valuePromise('');
17
18function valuePromise(value) {
19  var p = new Promise(Promise._61);
20  p._65 = 1;
21  p._55 = value;
22  return p;
23}
24Promise.resolve = function (value) {
25  if (value instanceof Promise) return value;
26
27  if (value === null) return NULL;
28  if (value === undefined) return UNDEFINED;
29  if (value === true) return TRUE;
30  if (value === false) return FALSE;
31  if (value === 0) return ZERO;
32  if (value === '') return EMPTYSTRING;
33
34  if (typeof value === 'object' || typeof value === 'function') {
35    try {
36      var then = value.then;
37      if (typeof then === 'function') {
38        return new Promise(then.bind(value));
39      }
40    } catch (ex) {
41      return new Promise(function (resolve, reject) {
42        reject(ex);
43      });
44    }
45  }
46  return valuePromise(value);
47};
48
49Promise.all = function (arr) {
50  var args = Array.prototype.slice.call(arr);
51
52  return new Promise(function (resolve, reject) {
53    if (args.length === 0) return resolve([]);
54    var remaining = args.length;
55    function res(i, val) {
56      if (val && (typeof val === 'object' || typeof val === 'function')) {
57        if (val instanceof Promise && val.then === Promise.prototype.then) {
58          while (val._65 === 3) {
59            val = val._55;
60          }
61          if (val._65 === 1) return res(i, val._55);
62          if (val._65 === 2) reject(val._55);
63          val.then(function (val) {
64            res(i, val);
65          }, reject);
66          return;
67        } else {
68          var then = val.then;
69          if (typeof then === 'function') {
70            var p = new Promise(then.bind(val));
71            p.then(function (val) {
72              res(i, val);
73            }, reject);
74            return;
75          }
76        }
77      }
78      args[i] = val;
79      if (--remaining === 0) {
80        resolve(args);
81      }
82    }
83    for (var i = 0; i < args.length; i++) {
84      res(i, args[i]);
85    }
86  });
87};
88
89Promise.reject = function (value) {
90  return new Promise(function (resolve, reject) {
91    reject(value);
92  });
93};
94
95Promise.race = function (values) {
96  return new Promise(function (resolve, reject) {
97    values.forEach(function(value){
98      Promise.resolve(value).then(resolve, reject);
99    });
100  });
101};
102
103/* Prototype Methods */
104
105Promise.prototype['catch'] = function (onRejected) {
106  return this.then(null, onRejected);
107};
108