| 1944 | /// This generator is async-reentrant. |
| 1945 | template <typename T> |
| 1946 | std::function<Future<T>()> MakeSingleFutureGenerator(Future<T> future) { |
| 1947 | assert(future.is_valid()); |
| 1948 | auto state = std::make_shared<Future<T>>(std::move(future)); |
| 1949 | return [state]() -> Future<T> { |
| 1950 | auto fut = std::move(*state); |
| 1951 | if (fut.is_valid()) { |
| 1952 | return fut; |
| 1953 | } else { |
| 1954 | return AsyncGeneratorEnd<T>(); |
| 1955 | } |
| 1956 | }; |
| 1957 | } |
| 1958 | |
| 1959 | /// \brief Make a generator that immediately ends. |
| 1960 | /// |