via and activate/deactivate chaining
[folly.git] / folly / wangle / Future-inl.h
index 06d225b02ade88f41cd7a69de21722fff8f01bb5..2df6fef2b38aeae3cb7c42275236cacc5bbd3ecd 100644 (file)
@@ -328,7 +328,7 @@ Try<T>& Future<T>::getTry() {
 
 template <class T>
 template <typename Executor>
-inline Future<T> Future<T>::via(Executor* executor) {
+inline Future<T> Future<T>::via(Executor* executor) && {
   throwIfInvalid();
 
   this->deactivate();
@@ -337,6 +337,17 @@ inline Future<T> Future<T>::via(Executor* executor) {
   return std::move(*this);
 }
 
+template <class T>
+template <typename Executor>
+inline Future<T> Future<T>::via(Executor* executor) & {
+  throwIfInvalid();
+
+  MoveWrapper<Promise<T>> p;
+  auto f = p->getFuture();
+  then([p](Try<T>&& t) mutable { p->fulfilTry(std::move(t)); });
+  return std::move(f).via(executor);
+}
+
 template <class T>
 bool Future<T>::isReady() const {
   throwIfInvalid();