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

Side by Side Diff: pkg/async/lib/result.dart

Issue 297033002: Add Result.flatten. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Making factory properly factory. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/async/pubspec.yaml » ('j') | pkg/async/pubspec.yaml » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 /** 5 /**
6 * Capture asynchronous results into synchronous values, and release them again. 6 * Capture asynchronous results into synchronous values, and release them again.
7 * 7 *
8 * Capturing a result (either a returned value or a thrown error) 8 * Capturing a result (either a returned value or a thrown error)
9 * means converting it into a [Result] - 9 * means converting it into a [Result] -
10 * either a [ValueResult] or an [ErrorResult]. 10 * either a [ValueResult] or an [ErrorResult].
11 * 11 *
12 * This value can release itself by writing itself either to a 12 * This value can release itself by writing itself either to a
13 * [EventSink] or a [Completer], or by becoming a [Future]. 13 * [EventSink] or a [Completer], or by becoming a [Future].
14 */ 14 */
15 library dart.pkg.async.results; 15 library dart.pkg.async.results;
16 16
17 import "dart:async"; 17 import "dart:async";
18 18
19 /** 19 /**
20 * The result of a computation. 20 * The result of a computation.
21 */ 21 */
22 abstract class Result<T> { 22 abstract class Result<T> {
23 /** 23 /**
24 * Create a `Result` with the result of calling [computation]. 24 * Create a `Result` with the result of calling [computation].
25 * 25 *
26 * This generates either a [ValueResult] with the value returned by 26 * This generates either a [ValueResult] with the value returned by
27 * calling `computation`, or an [ErrorResult] with an error thrown by 27 * calling `computation`, or an [ErrorResult] with an error thrown by
28 * the call. 28 * the call.
29 */ 29 */
30 Result(T computation()) { 30 factory Result(T computation()) {
31 try { 31 try {
32 return new ValueResult(computation()); 32 return new ValueResult(computation());
33 } catch (e, s) { 33 } catch (e, s) {
34 return new ErrorResult(e, s); 34 return new ErrorResult(e, s);
35 } 35 }
36 } 36 }
37 37
38 /** 38 /**
39 * Create a `Result` holding a value. 39 * Create a `Result` holding a value.
40 * 40 *
(...skipping 23 matching lines...) Expand all
64 * The resulting future will never have an error. 64 * The resulting future will never have an error.
65 * Errors have been converted to an [ErrorResult] value. 65 * Errors have been converted to an [ErrorResult] value.
66 */ 66 */
67 static Future<Result> capture(Future future) { 67 static Future<Result> capture(Future future) {
68 return future.then(_captureValue, onError: _captureError); 68 return future.then(_captureValue, onError: _captureError);
69 } 69 }
70 70
71 /** 71 /**
72 * Release the result of a captured future. 72 * Release the result of a captured future.
73 * 73 *
74 * Converts the [Result] value of the given [future] to a result or error 74 * Converts the [Result] value of the given [future] to a value or error
75 * completion of the returned future. 75 * completion of the returned future.
76 * 76 *
77 * If [future] completes with an error, the returned future completes with 77 * If [future] completes with an error, the returned future completes with
78 * the same error. 78 * the same error.
79 */ 79 */
80 static Future release(Future<Result> future) { 80 static Future release(Future<Result> future) {
81 return future.then(_release); 81 return future.then(_release);
82 } 82 }
83 83
84 /** 84 /**
(...skipping 15 matching lines...) Expand all
100 * the retuned stream as appropriate. 100 * the retuned stream as appropriate.
101 * Errors from the source stream become errors in the returned stream. 101 * Errors from the source stream become errors in the returned stream.
102 * 102 *
103 * Shorthand for transforming the stream using [ReleaseStreamTransformer]. 103 * Shorthand for transforming the stream using [ReleaseStreamTransformer].
104 */ 104 */
105 static Stream releaseStream(Stream<Result> source) { 105 static Stream releaseStream(Stream<Result> source) {
106 return source.transform(const ReleaseStreamTransformer()); 106 return source.transform(const ReleaseStreamTransformer());
107 } 107 }
108 108
109 /** 109 /**
110 * Converts a result of a result to a single result.
111 *
112 * If the result is an error, or it is a `Result` value
113 * which is then an error, then a result with that error is returned.
114 * Otherwise both levels of results are value results, and a single
115 * result with the value is returned.
116 */
117 static Result flatten(Result<Result> result) {
118 if (result.isError) return result;
119 return result.asValue.value;
120 }
121
122 /**
110 * Whether this result is a value result. 123 * Whether this result is a value result.
111 * 124 *
112 * Always the opposite of [isError]. 125 * Always the opposite of [isError].
113 */ 126 */
114 bool get isValue; 127 bool get isValue;
115 128
116 /** 129 /**
117 * Whether this result is an error result. 130 * Whether this result is an error result.
118 * 131 *
119 * Always the opposite of [isValue]. 132 * Always the opposite of [isValue].
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 } 282 }
270 } 283 }
271 void addError(Object error, StackTrace stackTrace) { 284 void addError(Object error, StackTrace stackTrace) {
272 // Errors may be added by intermediate processing, even if it is never 285 // Errors may be added by intermediate processing, even if it is never
273 // added by CaptureSink. 286 // added by CaptureSink.
274 _sink.addError(error, stackTrace); 287 _sink.addError(error, stackTrace);
275 } 288 }
276 289
277 void close() { _sink.close(); } 290 void close() { _sink.close(); }
278 } 291 }
OLDNEW
« no previous file with comments | « no previous file | pkg/async/pubspec.yaml » ('j') | pkg/async/pubspec.yaml » ('J')

Powered by Google App Engine
This is Rietveld 408576698