Index: lib/src/utils.dart |
diff --git a/lib/src/utils.dart b/lib/src/utils.dart |
index 37f2e6639248a30d20dd15e6d7293f54bd11b286..7d697981ffbe97dc5f9f36e2ec8923f7513cd1ae 100644 |
--- a/lib/src/utils.dart |
+++ b/lib/src/utils.dart |
@@ -184,6 +184,25 @@ Stream mergeStreams(Iterable<Stream> streamIter) { |
return controller.stream; |
} |
+/// Returns the first value [stream] emits, or `null` if [stream] closes before |
+/// emitting a value. |
+Future maybeFirst(Stream stream) { |
+ var completer = new Completer(); |
+ |
+ var subscription; |
+ subscription = stream.listen((data) { |
+ completer.complete(data); |
+ subscription.cancel(); |
+ }, onError: (error, stackTrace) { |
+ completer.completeError(error, stackTrace); |
+ subscription.cancel(); |
+ }, onDone: () { |
+ completer.complete(); |
+ }); |
+ |
+ return completer.future; |
+} |
+ |
/// Returns a random base64 string containing [bytes] bytes of data. |
/// |
/// [seed] is passed to [math.Random]; [urlSafe] and [addLineSeparator] are |