@@ -797,4 +797,59 @@ operator co_await(when_all_sender<Senders...> s) {
797
797
return {std::move (s)};
798
798
}
799
799
800
+ // ---------------------------------------------------------------------------------------
801
+ // lambda()
802
+ // ---------------------------------------------------------------------------------------
803
+
804
+ template <typename R, typename Fn, typename ...Args>
805
+ struct lambda_operation {
806
+ lambda_operation (R receiver, Fn fn, std::tuple<Args...> args)
807
+ : fn_{std::move (fn)}, op_{execution::connect (std::apply (fn, args), std::move (receiver))} { }
808
+
809
+ bool start_inline () {
810
+ return execution::start_inline (op_);
811
+ }
812
+
813
+ Fn fn_;
814
+ execution::operation_t <std::invoke_result_t <Fn, Args...>, R> op_;
815
+ };
816
+
817
+ template <typename Fn, typename ...Args>
818
+ struct [[nodiscard]] lambda_sender {
819
+ using value_type = std::invoke_result_t <Fn, Args...>::value_type;
820
+
821
+ Fn fn;
822
+ std::tuple<Args...> args;
823
+
824
+ template <typename Receiver>
825
+ friend lambda_operation<Receiver, Fn, Args...>
826
+ connect (lambda_sender s, Receiver r) {
827
+ return {std::move (r), std::move (s.fn ), std::move (s.args )};
828
+ }
829
+ };
830
+
831
+ template <typename Fn, typename ...Args>
832
+ sender_awaiter<lambda_sender<Fn, Args...>, typename lambda_sender<Fn, Args...>::value_type>
833
+ operator co_await (lambda_sender<Fn, Args...> s) {
834
+ return {std::move (s)};
835
+ }
836
+
837
+ template <typename Fn>
838
+ struct [[nodiscard]] lambda_callable {
839
+ template <typename ...Args >
840
+ auto operator ()(Args &&...args ) {
841
+ return lambda_sender{
842
+ std::move (fn),
843
+ std::forward_as_tuple (std::forward<Args>(args)...)
844
+ };
845
+ }
846
+
847
+ Fn fn;
848
+ };
849
+
850
+ template <typename Fn>
851
+ auto lambda (Fn fn) {
852
+ return lambda_callable<Fn>{std::move (fn)};
853
+ }
854
+
800
855
} // namespace async
0 commit comments