Commit 7d487470 authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot

Make coro::Task convertible to SemiFuture

Summary: coro::Task can be always converted to a lazy SemiFuture. This can be very useful when converting existing futures code to coroutines.

Reviewed By: yfeldblum

Differential Revision: D13502414

fbshipit-source-id: 2e3971217086c762f3f831ef19d0d88b621b7c80
parent 78c1e242
...@@ -296,6 +296,13 @@ class FOLLY_NODISCARD Task { ...@@ -296,6 +296,13 @@ class FOLLY_NODISCARD Task {
return TaskWithExecutor<T>{std::exchange(coro_, {})}; return TaskWithExecutor<T>{std::exchange(coro_, {})};
} }
SemiFuture<folly::lift_unit_t<T>> semi() && {
return makeSemiFuture().defer(
[task = std::move(*this)](Executor* executor, Try<Unit>&&) mutable {
return std::move(task).scheduleOn(executor).start();
});
}
private: private:
friend class detail::TaskPromiseBase; friend class detail::TaskPromiseBase;
friend class detail::TaskPromise<T>; friend class detail::TaskPromise<T>;
......
...@@ -32,6 +32,10 @@ coro::Task<int> task42() { ...@@ -32,6 +32,10 @@ coro::Task<int> task42() {
co_return 42; co_return 42;
} }
SemiFuture<int> semifuture_task42() {
return task42().semi();
}
TEST(Coro, Basic) { TEST(Coro, Basic) {
ManualExecutor executor; ManualExecutor executor;
auto future = task42().scheduleOn(&executor).start(); auto future = task42().scheduleOn(&executor).start();
...@@ -44,6 +48,19 @@ TEST(Coro, Basic) { ...@@ -44,6 +48,19 @@ TEST(Coro, Basic) {
EXPECT_EQ(42, std::move(future).get()); EXPECT_EQ(42, std::move(future).get());
} }
TEST(Coro, BasicSemiFuture) {
ManualExecutor executor;
auto future = semifuture_task42().via(&executor);
EXPECT_FALSE(future.isReady());
executor.drive();
executor.drive();
EXPECT_TRUE(future.isReady());
EXPECT_EQ(42, std::move(future).get());
}
TEST(Coro, BasicFuture) { TEST(Coro, BasicFuture) {
ManualExecutor executor; ManualExecutor executor;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment