20 #if !defined(RXCPP_OPERATORS_RX_MAP_HPP)
21 #define RXCPP_OPERATORS_RX_MAP_HPP
23 #include "../rx-includes.hpp"
32 struct map_invalid_arguments {};
35 struct map_invalid :
public rxo::operator_base<map_invalid_arguments<AN...>> {
36 using type = observable<map_invalid_arguments<
AN...>, map_invalid<
AN...>>;
39 using map_invalid_t =
typename map_invalid<
AN...>::type;
41 template<
class T,
class Selector>
44 typedef rxu::decay_t<T> source_value_type;
45 typedef rxu::decay_t<Selector> select_type;
46 typedef decltype((*(select_type*)
nullptr)(*(source_value_type*)
nullptr)) value_type;
50 : selector(std::move(s))
54 template<
class Subscriber>
57 typedef map_observer<Subscriber> this_type;
58 typedef decltype((*(select_type*)
nullptr)(*(source_value_type*)
nullptr)) value_type;
59 typedef rxu::decay_t<Subscriber> dest_type;
60 typedef observer<source_value_type, this_type> observer_type;
62 mutable select_type selector;
64 map_observer(dest_type d, select_type s)
66 , selector(std::move(s))
70 void on_next(Value&& v)
const {
73 return this->selector(std::forward<Value>(v));},
75 if (selected.empty()) {
78 dest.on_next(std::move(selected.get()));
83 void on_completed()
const {
87 static subscriber<source_value_type, observer_type> make(dest_type d, select_type s) {
88 auto cs = d.get_subscription();
89 return make_subscriber<source_value_type>(std::move(cs), observer_type(this_type(std::move(d), std::move(s))));
93 template<
class Subscriber>
94 auto operator()(Subscriber dest)
const
95 -> decltype(map_observer<Subscriber>::make(std::move(dest), selector)) {
96 return map_observer<Subscriber>::make(std::move(dest), selector);
104 template<
class...
AN>
112 template<
class...
AN>
123 template<
class Observable,
class Selector,
128 class Map = rxo::detail::map<SourceValue, ResolvedSelector>,
130 static auto member(Observable&& o, Selector&& s)
131 -> decltype(o.template lift<Value>(Map(std::forward<Selector>(s)))) {
132 return o.template lift<Value>(Map(std::forward<Selector>(s)));
135 template<
class...
AN>
136 static operators::detail::map_invalid_t<
AN...>
member(
const AN...) {
139 static_assert(
sizeof...(
AN) == 10000,
"map takes Selector");