Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: sdk/lib/async/future.dart

Issue 1992713002: Make Iterable.generate use ListIterable as base implementation. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | sdk/lib/core/iterable.dart » ('j') | sdk/lib/core/iterable.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of dart.async; 5 part of dart.async;
6 6
7 /** 7 /**
8 * An object representing a delayed computation. 8 * An object representing a delayed computation.
9 * 9 *
10 * A [Future] is used to represent a potential value, or error, 10 * A [Future] is used to represent a potential value, or error,
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 */ 356 */
357 static Future forEach(Iterable input, f(element)) { 357 static Future forEach(Iterable input, f(element)) {
358 Iterator iterator = input.iterator; 358 Iterator iterator = input.iterator;
359 return doWhile(() { 359 return doWhile(() {
360 if (!iterator.moveNext()) return false; 360 if (!iterator.moveNext()) return false;
361 return new Future.sync(() => f(iterator.current)).then((_) => true); 361 return new Future.sync(() => f(iterator.current)).then((_) => true);
362 }); 362 });
363 } 363 }
364 364
365 /** 365 /**
366 * Perform an async operation repeatedly until it returns `false`. 366 * Performs an async operation repeatedly until it returns `false`.
367 * 367 *
368 * Runs [f] repeatedly, starting the next iteration only when the [Future] 368 * The function [f] is called repeatedly while it returns either the [bool]
369 * returned by [f] completes to `true`. Returns a [Future] that completes once 369 * value `true` or a [Future] which completes with the value `true`.
370 * [f] returns `false`.
371 * 370 *
372 * The return values of all [Future]s are discarded. Any errors will cause the 371 * If a call to [f] returns `false` or a [Future] that completes to `false`,
373 * iteration to stop and will be piped through the returned [Future]. 372 * iteration ends and the future returned by [doWhile] is completed.
374 * 373 *
375 * The function [f] may return either a [bool] or a [Future] that completes to 374 * If a future returned by [f] completes with an error, iteration ends and
376 * a [bool]. If it returns a non-[Future], iteration continues immediately. 375 * the future returned by [doWhile] completes with the same error.
377 * Otherwise it waits for the returned [Future] to complete. 376 *
377 * The [f] function must return either a `bool` value or a [Future] completing
378 * with a `bool` value.
378 */ 379 */
379 static Future doWhile(f()) { 380 static Future doWhile(f()) {
380 _Future doneSignal = new _Future(); 381 _Future doneSignal = new _Future();
381 var nextIteration; 382 var nextIteration;
382 // Bind this callback explicitly so that each iteration isn't bound in the 383 // Bind this callback explicitly so that each iteration isn't bound in the
383 // context of all the previous iterations' callbacks. 384 // context of all the previous iterations' callbacks.
384 nextIteration = Zone.current.bindUnaryCallback((bool keepGoing) { 385 nextIteration = Zone.current.bindUnaryCallback((bool keepGoing) {
385 if (keepGoing) { 386 if (keepGoing) {
386 new Future.sync(f).then(nextIteration, 387 new Future.sync(f).then(nextIteration,
387 onError: doneSignal._completeError); 388 onError: doneSignal._completeError);
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 if (replacement != null) { 756 if (replacement != null) {
756 error = _nonNullError(replacement.error); 757 error = _nonNullError(replacement.error);
757 stackTrace = replacement.stackTrace; 758 stackTrace = replacement.stackTrace;
758 } 759 }
759 result._completeError(error, stackTrace); 760 result._completeError(error, stackTrace);
760 } 761 }
761 762
762 /** Helper function that converts `null` to a [NullThrownError]. */ 763 /** Helper function that converts `null` to a [NullThrownError]. */
763 Object _nonNullError(Object error) => 764 Object _nonNullError(Object error) =>
764 (error != null) ? error : new NullThrownError(); 765 (error != null) ? error : new NullThrownError();
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/core/iterable.dart » ('j') | sdk/lib/core/iterable.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698