maybe<typename std::size_t> maximum_idx_maybe(const Container& xs)
{
    if (is_empty(xs))
        return {};
    else
        return maximum_idx(xs);
}
typename std::size_t maximum_idx_on(F f, const Container& xs)
{
    typedef typename std::result_of<F(typename Container::value_type)>::type Result;
    auto transformed = transform_convert<std::vector<Result>>(f, xs);
    return maximum_idx(transformed);
}
std::size_t maximum_idx_on(F f, const Container& xs)
{
    using Result = internal::invoke_result_t<F, typename Container::value_type>;
    auto transformed = transform_convert<std::vector<std::decay_t<Result>>>(f, xs);
    return maximum_idx(transformed);
}