// Needed for Workaround #if !NET_4_6 using System; namespace LinqInternal.Threading.Needles { [System.Diagnostics.DebuggerNonUserCode] internal class PromiseNeedle : Promise, IWaitablePromise, IRecyclableNeedle, ICacheNeedle { private readonly int _hashCode; private T _target; public PromiseNeedle(bool done) : base(done) { _target = default(T); _hashCode = base.GetHashCode(); } public PromiseNeedle(Exception exception) : base(exception) { _target = default(T); _hashCode = exception.GetHashCode(); } protected PromiseNeedle(T target) : base(true) { _target = target; _hashCode = ReferenceEquals(target, null) ? base.GetHashCode() : target.GetHashCode(); } public bool IsAlive { get { return !ReferenceEquals(_target, null); } } public virtual T Value { get { var exception = Exception; if (exception == null) { return _target; } throw exception; } set { _target = value; SetCompleted(); } } public static PromiseNeedle CreateFromValue(T target) { return new PromiseNeedle(target); } public static bool operator !=(PromiseNeedle left, PromiseNeedle right) { return NotEqualsExtracted(left, right); } public static bool operator ==(PromiseNeedle left, PromiseNeedle right) { return EqualsExtracted(left, right); } public static explicit operator T(PromiseNeedle needle) { if (needle == null) { throw new ArgumentNullException("needle"); } return needle.Value; } public override bool Equals(object obj) { var needle = obj as PromiseNeedle; if (needle != null) { return EqualsExtracted(this, needle); } return IsCompleted && Value.Equals(obj); } public bool Equals(PromiseNeedle other) { return EqualsExtracted(this, other); } public override void Free() { base.Free(); _target = default(T); } public override int GetHashCode() { return _hashCode; } public override string ToString() { return IsCompleted ? (Exception == null ? _target.ToString() : Exception.ToString()) : "[Not Created]"; } public bool TryGetValue(out T value) { var result = IsCompleted; value = _target; return result; } private static bool EqualsExtracted(PromiseNeedle left, PromiseNeedle right) { if (ReferenceEquals(left, null)) { return ReferenceEquals(right, null); } return left.Equals(right); } private static bool NotEqualsExtracted(PromiseNeedle left, PromiseNeedle right) { if (ReferenceEquals(left, null)) { return !ReferenceEquals(right, null); } return !left.Equals(right); } } } #endif