1 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
5 #if !defined(RXCPP_OPERATORS_RX_MAP_HPP)
6 #define RXCPP_OPERATORS_RX_MAP_HPP
8 #include "../rx-includes.hpp"
17 template<class T, class Selector>
20 typedef typename std::decay<T>::type source_value_type;
21 typedef typename std::decay<Selector>::type select_type;
22 typedef decltype((*(select_type*)nullptr)(*(source_value_type*)nullptr)) value_type;
26 : selector(std::move(s))
30 template<class Subscriber>
33 typedef map_observer<Subscriber> this_type;
34 typedef decltype((*(select_type*)nullptr)(*(source_value_type*)nullptr)) value_type;
35 typedef typename std::decay<Subscriber>::type dest_type;
36 typedef observer<T, this_type> observer_type;
40 map_observer(dest_type d, select_type s)
42 , selector(std::move(s))
45 void on_next(source_value_type v) const {
46 auto selected = on_exception(
48 return this->selector(std::move(v));},
50 if (selected.empty()) {
53 dest.on_next(std::move(selected.get()));
55 void on_error(std::exception_ptr e) const {
58 void on_completed() const {
62 static subscriber<T, observer_type> make(dest_type d, select_type s) {
63 auto cs = d.get_subscription();
64 return make_subscriber<T>(std::move(cs), observer_type(this_type(std::move(d), std::move(s))));
68 template<class Subscriber>
69 auto operator()(Subscriber dest) const
70 -> decltype(map_observer<Subscriber>::make(std::move(dest), selector)) {
71 return map_observer<Subscriber>::make(std::move(dest), selector);
75 template<class Selector>
78 typedef typename std::decay<Selector>::type select_type;
81 map_factory(select_type s) : selector(std::move(s)) {}
82 template<class Observable>
83 auto operator()(Observable&& source)
84 -> decltype(source.template lift<typename map<typename std::decay<Observable>::type::value_type, select_type>::value_type>(map<typename std::decay<Observable>::type::value_type, select_type>(selector))) {
85 return source.template lift<typename map<typename std::decay<Observable>::type::value_type, select_type>::value_type>(map<typename std::decay<Observable>::type::value_type, select_type>(selector));
91 template<class Selector>
92 auto map(Selector&& p)
93 -> detail::map_factory<Selector> {
94 return detail::map_factory<Selector>(std::forward<Selector>(p));