BareGit
#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