93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
 | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #if !defined(RXCPP_SOURCES_RX_CREATE_HPP)
 | ||
|  | #define RXCPP_SOURCES_RX_CREATE_HPP
 | ||
|  | 
 | ||
|  | #include "../rx-includes.hpp"
 | ||
|  | 
 | ||
|  | /*! \file rx-create.hpp
 | ||
|  | 
 | ||
|  |     \brief Returns an observable that executes the specified function when a subscriber subscribes to it. | ||
|  | 
 | ||
|  |     \tparam T  the type of the items that this observable emits | ||
|  |     \tparam OnSubscribe  the type of OnSubscribe handler function | ||
|  | 
 | ||
|  |     \param  os  OnSubscribe event handler | ||
|  | 
 | ||
|  |     \return  Observable that executes the specified function when a Subscriber subscribes to it. | ||
|  | 
 | ||
|  |     \sample | ||
|  |     \snippet create.cpp Create sample | ||
|  |     \snippet output.txt Create sample | ||
|  | 
 | ||
|  |     \warning | ||
|  |     It is good practice to check the observer's is_subscribed state from within the function you pass to create | ||
|  |     so that your observable can stop emitting items or doing expensive calculations when there is no longer an interested observer. | ||
|  | 
 | ||
|  |     \badcode | ||
|  |     \snippet create.cpp Create bad code | ||
|  |     \snippet output.txt Create bad code | ||
|  | 
 | ||
|  |     \goodcode | ||
|  |     \snippet create.cpp Create good code | ||
|  |     \snippet output.txt Create good code | ||
|  | 
 | ||
|  |     \warning | ||
|  |     It is good practice to use operators like observable::take to control lifetime rather than use the subscription explicitly. | ||
|  | 
 | ||
|  |     \goodcode | ||
|  |     \snippet create.cpp Create great code | ||
|  |     \snippet output.txt Create great code | ||
|  | */ | ||
|  | 
 | ||
|  | namespace rxcpp { | ||
|  | 
 | ||
|  | namespace sources { | ||
|  | 
 | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | template<class T, class OnSubscribe> | ||
|  | struct create : public source_base<T> | ||
|  | { | ||
|  |     typedef create<T, OnSubscribe> this_type; | ||
|  | 
 | ||
|  |     typedef rxu::decay_t<OnSubscribe> on_subscribe_type; | ||
|  | 
 | ||
|  |     on_subscribe_type on_subscribe_function; | ||
|  | 
 | ||
|  |     create(on_subscribe_type os) | ||
|  |         : on_subscribe_function(std::move(os)) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     template<class Subscriber> | ||
|  |     void on_subscribe(Subscriber o) const { | ||
|  | 
 | ||
|  |         on_exception( | ||
|  |             [&](){ | ||
|  |                 this->on_subscribe_function(o); | ||
|  |                 return true; | ||
|  |             }, | ||
|  |             o); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | /*! @copydoc rx-create.hpp
 | ||
|  |     */ | ||
|  | template<class T, class OnSubscribe> | ||
|  | auto create(OnSubscribe os) | ||
|  |     ->      observable<T,   detail::create<T, OnSubscribe>> { | ||
|  |     return  observable<T,   detail::create<T, OnSubscribe>>( | ||
|  |                             detail::create<T, OnSubscribe>(std::move(os))); | ||
|  | } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |