using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ZeroLevel.Services.Async
{
    /// 
    /// Represents the producer side of a   unbound to a delegate, providing access to the consumer side through the   property.
    ///  
    public sealed class TaskCompletionSource
    {
        /// 
        /// The underlying TCS.
        ///  
        private readonly TaskCompletionSource _tcs;
        /// 
        /// Initializes a new instance of the   class.
        ///  
        public TaskCompletionSource()
        {
            _tcs = new TaskCompletionSource();
        }
        /// 
        /// Initializes a new instance of the   class with the specified state.
        ///  
        ///  The state to use as the underlying  's  .
        public TaskCompletionSource(object state)
        {
            _tcs = new TaskCompletionSource(state);
        }
        /// 
        /// Initializes a new instance of the   class with the specified options.
        ///  
        ///  The options to use when creating the underlying  .
        public TaskCompletionSource(TaskCreationOptions creationOptions)
        {
            _tcs = new TaskCompletionSource(creationOptions);
        }
        /// 
        /// Initializes a new instance of the   class with the specified state and options.
        ///  
        ///  The state to use as the underlying  's  .
        ///  The options to use when creating the underlying  .
        public TaskCompletionSource(object state, TaskCreationOptions creationOptions)
        {
            _tcs = new TaskCompletionSource(state, creationOptions);
        }
        /// 
        /// Gets the   created by this  .
        ///  
        public Task Task
        {
            get { return _tcs.Task; }
        }
        /// 
        /// Transitions the underlying   into the   state.
        ///  
        /// The underlying   has already been completed. 
        public void SetCanceled()
        {
            _tcs.SetCanceled();
        }
        /// 
        /// Attempts to transition the underlying   into the   state.
        ///  
        /// true  if the operation was successful; otherwise, false . 
        public bool TrySetCanceled()
        {
            return _tcs.TrySetCanceled();
        }
        /// 
        /// Transitions the underlying   into the   state.
        ///  
        ///  The exception to bind to this  . May not be null .
        /// The underlying   has already been completed. 
        public void SetException(Exception exception)
        {
            _tcs.SetException(exception);
        }
        /// 
        /// Transitions the underlying   into the   state.
        ///  
        ///  The collection of exceptions to bind to this  . May not be null  or contain null  elements.
        /// The underlying   has already been completed. 
        public void SetException(IEnumerable exceptions)
        {
            _tcs.SetException(exceptions);
        }
        /// 
        /// Attempts to transition the underlying   into the   state.
        ///  
        ///  The exception to bind to this  . May not be null .
        /// true  if the operation was successful; otherwise, false . 
        public bool TrySetException(Exception exception)
        {
            return _tcs.TrySetException(exception);
        }
        /// 
        /// Attempts to transition the underlying   into the   state.
        ///  
        ///  The collection of exceptions to bind to this  . May not be null  or contain null  elements.
        /// true  if the operation was successful; otherwise, false . 
        public bool TrySetException(IEnumerable exceptions)
        {
            return _tcs.TrySetException(exceptions);
        }
        /// 
        /// Transitions the underlying   into the   state.
        ///  
        /// The underlying   has already been completed. 
        public void SetResult()
        {
            _tcs.SetResult(null);
        }
        /// 
        /// Attempts to transition the underlying   into the   state.
        ///  
        /// true  if the operation was successful; otherwise, false . 
        public bool TrySetResult()
        {
            return _tcs.TrySetResult(null);
        }
    }
}