/// <summary>
        ///     Returns a promise that resolves when all of the promises in the enumerable argument have resolved.
        ///     Returns a promise of a collection of the resolved results.
        /// </summary>
        public static IPromise <IEnumerable <PromisedT> > All(IEnumerable <IPromise <PromisedT> > promises)
        {
            var promisesArray = promises.ToArray();

            if (promisesArray.Length == 0)
            {
                return(Promise <IEnumerable <PromisedT> > .Resolved(EnumerableExt.Empty <PromisedT>()));
            }

            var remainingCount = promisesArray.Length;
            var results        = new PromisedT[remainingCount];
            var resultPromise  = new Promise <IEnumerable <PromisedT> >();

            resultPromise.WithName("All");

            promisesArray.Each((promise, index) => {
                promise
                .Catch(ex => {
                    if (resultPromise.CurState == PromiseState.Pending)
                    {
                        resultPromise.Reject(ex);
                    }
                })
                .Then(result => {
                    results[index] = result;

                    --remainingCount;
                    if (remainingCount <= 0)
                    {
                        resultPromise.Resolve(results);
                    }
                })
                .Done();
            });

            return(resultPromise);
        }
 public IPromise <ConvertedT> Transform <ConvertedT>(Func <PromisedT, ConvertedT> transform)
 {
     //            Argument.NotNull(() => transform);
     return(Then(value => Promise <ConvertedT> .Resolved(transform(value))));
 }