#pragma once

#include <algorithm>
#include <iterator>

namespace utils
{
namespace detail
{

template <class T>
concept has_member_reserve = requires(T t) { t.reserve(size_t{}); };

} // namespace detail

template <template <class, class...> class R, class Container, class Functor>
inline auto transform(const Container& container, Functor&& f)
{
    auto result = R<decltype(f(*container.begin()))>{};

    if constexpr (detail::has_member_reserve<decltype(result)>)
    {
        result.reserve(container.size());
    }

    std::transform(container.begin(), container.end(),
                   std::inserter(result, result.end()),
                   std::forward<Functor>(f));

    return result;
}

template <template <class, class...> class Container, class Functor,
          class... Args>
inline auto transform(const Container<Args...>& container, Functor&& f)
{
    return transform<Container, Container<Args...>, Functor>(
        container, std::forward<Functor>(f));
}

} // namespace utils
