Index: utils/pub/utils.dart |
diff --git a/utils/pub/utils.dart b/utils/pub/utils.dart |
index 7710ac194a1691e2da88c94fad9f780979d93f07..e283a2e02cd2d0036c3e54b1dbb7f384ce3425ae 100644 |
--- a/utils/pub/utils.dart |
+++ b/utils/pub/utils.dart |
@@ -118,6 +118,18 @@ void chainToCompleter(Future future, Completer completer) { |
onError: (e) => completer.completeError(e.error, e.stackTrace)); |
} |
+/// Like [Iterable.where], but allows [test] to return [Future]s and uses the |
+/// results of those [Future]s as the test. |
+Future<Iterable> futureWhere(Iterable iter, test(value)) { |
+ return Future.wait(iter.mappedBy((e) { |
+ var result = test(e); |
+ if (result is! Future) result = new Future.immediate(result); |
+ return result.then((result) => new Pair(e, result)); |
+ })) |
+ .then((pairs) => pairs.where((pair) => pair.last)) |
+ .then((pairs) => pairs.mappedBy((pair) => pair.first)); |
+} |
+ |
// TODO(nweiz): unify the following functions with the utility functions in |
// pkg/http. |