| 125 | /// \brief Collect the results of an async generator into a vector |
| 126 | template <typename T> |
| 127 | Future<std::vector<T>> CollectAsyncGenerator(AsyncGenerator<T> generator) { |
| 128 | auto vec = std::make_shared<std::vector<T>>(); |
| 129 | auto loop_body = [generator = std::move(generator), |
| 130 | vec = std::move(vec)]() -> Future<ControlFlow<std::vector<T>>> { |
| 131 | auto next = generator(); |
| 132 | return next.Then([vec](const T& result) -> Result<ControlFlow<std::vector<T>>> { |
| 133 | if (IsIterationEnd(result)) { |
| 134 | return Break(*vec); |
| 135 | } else { |
| 136 | vec->push_back(result); |
| 137 | return Continue(); |
| 138 | } |
| 139 | }); |
| 140 | }; |
| 141 | return Loop(std::move(loop_body)); |
| 142 | } |
| 143 | |
| 144 | /// \see MakeMappedGenerator |
| 145 | template <typename T, typename V> |