/// <summary>
        /// Creates a subscription to the source, where in every occurrence of the source stream, it transforms the input
        /// item using the <paramref name="selector"/> and pushes the result to the <paramref name="observer"/>.
        /// </summary>
        /// <param name="source">The original source stream.</param>
        /// <param name="observer">The observer of the output stream.</param>
        /// <param name="selector">The conversion delegate to convert from the original type to the destination.</param>
        /// <typeparam name="Tin">The type of the original source stream.</typeparam>
        /// <typeparam name="Tout">The type of the observer and output stream.</typeparam>
        /// <returns>Returns a subscription token used to unsubscribe to the original source.</returns>
        /// <remarks>This method is behaviorally equivalent to doing the following using Rx: source.Select(selector).Subscribe(observer).</remarks>
        public static IDisposable CreateSubscription <Tin, Tout>(this IObservable <Tin> source, IObserver <Tout> observer, Func <Tin, Tout> selector)
            where Tin : class
        {
            var projection = new Projection <Tin, Tout>(observer, selector);

            return(projection.Connect(source));
        }