15 #ifndef BELUGA_ACTIONS_ASSIGN_HPP
16 #define BELUGA_ACTIONS_ASSIGN_HPP
18 #include <range/v3/action/action.hpp>
19 #include <range/v3/functional/bind_back.hpp>
20 #include <range/v3/range/conversion.hpp>
21 #include <range/v3/view/view.hpp>
32 template <
class T,
class =
void>
33 struct is_range_closure : std::false_type {};
36 struct is_range_closure<ranges::actions::action_closure<T>> : std::true_type {};
39 struct is_range_closure<ranges::views::view_closure<T>> : std::true_type {};
42 inline constexpr
bool is_range_closure_v = is_range_closure<T>::value;
54 std::enable_if_t<ranges::range<Range>,
int> = 0,
55 std::enable_if_t<is_range_closure_v<Fn>,
int> = 0>
56 constexpr
auto operator()(Range& range, Fn fn)
const -> Range& {
57 auto&& view = fn(range);
58 if constexpr (!std::is_same_v<Range, std::decay_t<decltype(view)>>) {
61 range = std::move(view) | ranges::to<Range>;
79 template <
class Fn, std::enable_if_t<is_range_closure_v<Fn>,
int> = 0>
81 return ranges::make_action_closure(ranges::bind_back(
assign_fn{}, std::move(fn)));