namespace std::ranges {
template<class F, class Tuple>
constexpr auto tuple-transform(F&& f, Tuple&& t) {
return apply([&]<class. Ts>(Ts&&. elements) {
return tuple<invoke_result_t<F&, Ts>.>(invoke(f, std::forward<Ts>(elements)).);
}, std::forward<Tuple>(t));
}
template<class F, class Tuple>
constexpr void tuple-for-each(F&& f, Tuple&& t) {
apply([&]<class. Ts>(Ts&&. elements) {
(static_cast<void>(invoke(f, std::forward<Ts>(elements)), ..);
}, std::forward<Tuple>(t));
}
template<class T>
constexpr T& as-lvalue(T&& t) {
return static_cast<T&>(t);
}
template<bool Const, class. Views>
concept all-random-access =
(random_access_range<maybe-const<Const, Views>> && ..);
template<bool Const, class. Views>
concept all-bidirectional =
(bidirectional_range<maybe-const<Const, Views>> && ..);
template<bool Const, class. Views>
concept all-forward =
(forward_range<maybe-const<Const, Views>> && ..);
}