// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/telegram/QueryCombiner.h" namespace td { void QueryCombiner::add_query(int64 query_id, Promise> &&send_query, Promise &&promise) { auto &query = queries_[query_id]; if (promise) { query.promises.push_back(std::move(promise)); } if (query.is_sent) { // just wait for the result return; } query.is_sent = true; send_query.set_value(PromiseCreator::lambda([actor_id = actor_id(this), query_id](Result &&result) { send_closure(actor_id, &QueryCombiner::on_get_query_result, query_id, std::move(result)); })); } void QueryCombiner::on_get_query_result(int64 query_id, Result &&result) { auto it = queries_.find(query_id); CHECK(it != queries_.end()); CHECK(it->second.is_sent); auto promises = std::move(it->second.promises); queries_.erase(it); for (auto &promise : promises) { if (result.is_ok()) { promise.set_value(Unit()); } else { promise.set_error(result.error().clone()); } } } } // namespace td