Kit.Core/LibExternal/System.Reactive/Internal/Either.Generic.cs

97 lines
3.0 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT License.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
using System.Globalization;
namespace System.Reactive
{
internal abstract class Either<TLeft, TRight>
{
private Either()
{
}
public static Either<TLeft, TRight> CreateLeft(TLeft value) => new Left(value);
public static Either<TLeft, TRight> CreateRight(TRight value) => new Right(value);
public abstract TResult Switch<TResult>(Func<TLeft, TResult> caseLeft, Func<TRight, TResult> caseRight);
public abstract void Switch(Action<TLeft> caseLeft, Action<TRight> caseRight);
public sealed class Left : Either<TLeft, TRight>, IEquatable<Left>
{
public Left(TLeft value)
{
Value = value;
}
public TLeft Value { get; }
public override TResult Switch<TResult>(Func<TLeft, TResult> caseLeft, Func<TRight, TResult> caseRight) => caseLeft(Value);
public override void Switch(Action<TLeft> caseLeft, Action<TRight> caseRight) => caseLeft(Value);
public bool Equals(Left? other)
{
if (other == this)
{
return true;
}
if (other == null)
{
return false;
}
return EqualityComparer<TLeft>.Default.Equals(Value, other.Value);
}
public override bool Equals(object? obj) => Equals(obj as Left);
public override int GetHashCode() => Value?.GetHashCode() ?? 0;
public override string ToString()
{
return string.Format(CultureInfo.CurrentCulture, "Left({0})", Value);
}
}
public sealed class Right : Either<TLeft, TRight>, IEquatable<Right>
{
public Right(TRight value)
{
Value = value;
}
public TRight Value { get; }
public override TResult Switch<TResult>(Func<TLeft, TResult> caseLeft, Func<TRight, TResult> caseRight) => caseRight(Value);
public override void Switch(Action<TLeft> caseLeft, Action<TRight> caseRight) => caseRight(Value);
public bool Equals(Right? other)
{
if (other == this)
{
return true;
}
if (other == null)
{
return false;
}
return EqualityComparer<TRight>.Default.Equals(Value, other.Value);
}
public override bool Equals(object? obj) => Equals(obj as Right);
public override int GetHashCode() => Value?.GetHashCode() ?? 0;
public override string ToString() => string.Format(CultureInfo.CurrentCulture, "Right({0})", Value);
}
}
}