#pragma once
#include <utility>
#include <vector>
#include <mw/task.hpp>
#include "started_task.hpp"
namespace agent_smith::internal
{
/// Await started tasks in input order without changing their concurrency.
template <typename T>
mw::Task<std::vector<mw::E<T>>>
gatherAllStarted(std::vector<StartedTask<T>> tasks)
{
std::vector<mw::E<T>> results;
results.reserve(tasks.size());
for(auto& task : tasks)
{
results.push_back(co_await std::move(task));
}
co_return results;
}
/// Start all supplied tasks, then collect their results in input order.
template <typename T>
mw::Task<std::vector<mw::E<T>>> gatherAll(std::vector<mw::Task<mw::E<T>>> tasks)
{
std::vector<StartedTask<T>> started;
started.reserve(tasks.size());
for(auto& task : tasks)
{
started.push_back(StartedTask<T>::start(std::move(task)));
}
co_return co_await gatherAllStarted(std::move(started));
}
} // namespace agent_smith::internal