// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
#if HAS_AWAIT
using System.Threading;
using System.Reactive.Disposables;
using System.Reactive.Subjects;
namespace System.Reactive.Linq
{
    public static partial class Observable
    {
        /// 
        /// Gets an awaiter that returns the last value of the observable sequence or throws an exception if the sequence is empty.
        /// This operation subscribes to the observable sequence, making it hot.
        /// 
        /// The type of the elements in the source sequence.
        /// Source sequence to await.
        /// Object that can be awaited.
        ///  is null.
        public static AsyncSubject GetAwaiter(this IObservable source)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            return s_impl.GetAwaiter(source);
        }
        /// 
        /// Gets an awaiter that returns the last value of the observable sequence or throws an exception if the sequence is empty.
        /// This operation subscribes and connects to the observable sequence, making it hot.
        /// 
        /// The type of the elements in the source sequence.
        /// Source sequence to await.
        /// Object that can be awaited.
        ///  is null.
        public static AsyncSubject GetAwaiter(this IConnectableObservable source)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            return s_impl.GetAwaiter(source);
        }
        /// 
        /// Gets an awaiter that returns the last value of the observable sequence or throws an exception if the sequence is empty.
        /// This operation subscribes to the observable sequence, making it hot. The supplied CancellationToken can be used to cancel the subscription.
        /// 
        /// The type of the elements in the source sequence.
        /// Source sequence to await.
        /// Cancellation token.
        /// Object that can be awaited.
        ///  is null.
        public static AsyncSubject RunAsync(this IObservable source, CancellationToken cancellationToken)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            return s_impl.RunAsync(source, cancellationToken);
        }
        /// 
        /// Gets an awaiter that returns the last value of the observable sequence or throws an exception if the sequence is empty.
        /// This operation subscribes and connects to the observable sequence, making it hot. The supplied CancellationToken can be used to cancel the subscription and connection.
        /// 
        /// The type of the elements in the source sequence.
        /// Source sequence to await.
        /// Cancellation token.
        /// Object that can be awaited.
        ///  is null.
        public static AsyncSubject RunAsync(this IConnectableObservable source, CancellationToken cancellationToken)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            return s_impl.RunAsync(source, cancellationToken);
        }
    }
}
#endif