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

Unified Diff: pkg/barback/lib/src/serialize.dart

Issue 149243009: Add support for lazy transformers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: pkg/barback/lib/src/serialize.dart
diff --git a/pkg/barback/lib/src/serialize.dart b/pkg/barback/lib/src/serialize.dart
index 7114039e44d5cc417baf8dfc62a97400619447c3..4d3f973f2a313b097c9f2806d8fda22efff6e992 100644
--- a/pkg/barback/lib/src/serialize.dart
+++ b/pkg/barback/lib/src/serialize.dart
@@ -33,6 +33,44 @@ SendPort serializeStream(Stream stream) {
return receivePort.sendPort;
}
+/// Converts [callback] into a [SendPort] which which another isolate can call
Bob Nystrom 2014/01/30 19:33:44 I think you had something similar in the previous
nweiz 2014/01/31 03:43:27 I don't like how this description exposes the impl
Bob Nystrom 2014/01/31 18:28:53 I'm OK with that too, but in that case, I wouldn't
+/// [callback].
+///
+/// [callback] may return either a serializable value or a [Future] of a
+/// serializable value.
+SendPort serializeCallback(callback()) {
+ var receivePort = new ReceivePort();
+ receivePort.first.then(
+ (sendPort) => _sendFuture(syncFuture(callback), sendPort));
+ return receivePort.sendPort;
+}
+
+/// Converts [future] into a [SendPort] which which another isolate can listen
+/// to the value of [Future].
Bob Nystrom 2014/01/30 19:33:44 Ditto above comment.
nweiz 2014/01/31 03:43:27 N/A
+///
+/// [Future] must produce a serializable value.
+SendPort serializeFuture(Future future) {
+ // Ensure the future doesn't top-level an error that arrives before
+ // [receivePort] fires.
+ future.catchError(null);
Bob Nystrom 2014/01/30 19:33:44 I don't understand how passing a null catch handle
nweiz 2014/01/31 03:43:27 "null" means approximately the same thing as "() {
Bob Nystrom 2014/01/31 18:28:53 Oh, wow. That's totally news to me. They certainly
+
+ var receivePort = new ReceivePort();
+ receivePort.first.then((sendPort) => _sendFuture(future, sendPort));
+ return receivePort.sendPort;
+}
+
+/// A helper method for sending the result of [future] across [sendPort].
Bob Nystrom 2014/01/30 19:33:44 "helper method" doesn't add much. How about "Sends
nweiz 2014/01/31 03:43:27 N/A
+void _sendFuture(Future future, SendPort sendPort) {
+ future.then((value) {
+ sendPort.send({'type': 'success', 'value': value});
+ }, onError: (error, stackTrace) {
+ sendPort.send({
+ 'type': 'error',
+ 'error': CrossIsolateException.serialize(error, stackTrace)
+ });
+ });
+}
+
/// Converts a serializable map into an [AssetId].
AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
@@ -52,6 +90,34 @@ Stream deserializeStream(SendPort sendPort) {
});
}
+/// A function that takes no arguments and returns a future.
+typedef Future AsyncFunction();
+
+/// Converts a [SendPort] that was created using [serializeCallback] to a
+/// callback that returns a [Future].
+///
+/// If [deserialize] is passed, the return value of the callback is passed
+/// through it before being returned.
+AsyncFunction deserializeCallback(SendPort sendPort, [deserialize(value)]) {
+ return () {
Bob Nystrom 2014/01/30 19:33:44 What's the outer function wrapper for?
+ return deserializeFuture(sendPort).then((value) {
+ return deserialize == null ? value : deserialize(value);
+ });
+ };
+}
+
+/// Converts a [SendPort] that was created using [serializeFuture] to a
+/// [Future].
+Future deserializeFuture(SendPort sendPort) {
+ var receivePort = new ReceivePort();
+ sendPort.send(receivePort.sendPort);
+ return receivePort.first.then((response) {
+ if (response['type'] == 'success') return response['value'];
+ var exception = new CrossIsolateException.deserialize(response['error']);
+ return new Future.error(exception, exception.stackTrace);
+ });
+}
+
/// The body of a [StreamTransformer] that deserializes the values in a stream
/// sent by [serializeStream].
StreamSubscription _deserializeTransformer(Stream input, bool cancelOnError) {

Powered by Google App Engine
This is Rietveld 408576698