// Copyright 2021 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef GRPC_SRC_CORE_LIB_PROMISE_SEQ_H #define GRPC_SRC_CORE_LIB_PROMISE_SEQ_H #include <grpc/support/port_platform.h> #include <type_traits> #include <utility> #include "src/core/lib/promise/detail/basic_seq.h" #include "src/core/lib/promise/detail/promise_like.h" #include "src/core/lib/promise/poll.h" namespace grpc_core { namespace promise_detail { template <typename T> struct SeqTraits { … }; Seq; template <typename I, typename F, typename Arg> struct SeqIterTraits { … }; template <typename Iter, typename Factory, typename Argument> struct SeqIterResultTraits { … }; } // namespace promise_detail // Sequencing combinator. // Run the first promise. // Pass its result to the second, and run the returned promise. // Pass its result to the third, and run the returned promise. // etc // Return the final value. template <typename... Functors> promise_detail::Seq<Functors...> Seq(Functors... functors) { … } template <typename F> F Seq(F functor) { … } // Execute a sequence of operations of unknown length. // Asynchronously: // for (element in (begin, end)) { // argument = wait_for factory(element, argument); // } // return argument; template <typename Iter, typename Factory, typename Argument> typename promise_detail::SeqIterResultTraits<Iter, Factory, Argument>::Result SeqIter(Iter begin, Iter end, Argument argument, Factory factory) { … } } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_PROMISE_SEQ_H