session-companion/SessionCompanion/SessionCompanion.Extensions/EitherType/Either.cs

120 lines
4.0 KiB
C#
Raw Permalink Normal View History

using System;
2020-12-10 13:15:11 +01:00
namespace SessionCompanion.Extensions.EitherType
{
2020-12-10 13:15:11 +01:00
public class Either<TL, TR>
{
2020-12-10 17:34:46 +01:00
/// <summary>
/// Kontruktor dla lewej zmiennej
/// </summary>
/// <param name="left">Wartość lewej zmiennej</param>
2020-12-10 13:15:11 +01:00
public Either(TL left)
{
2020-12-10 17:34:46 +01:00
this.Left = left;
this.IsLeft = true;
2020-12-10 13:15:11 +01:00
}
2020-12-10 17:34:46 +01:00
/// <summary>
/// Konstruktor dla prawej zmiennej
/// </summary>
/// <param name="right">Wartość prawej zmiennej</param>
2020-12-10 13:15:11 +01:00
public Either(TR right)
{
2020-12-10 17:34:46 +01:00
this.Right = right;
this.IsLeft = false;
2020-12-10 13:15:11 +01:00
}
2020-12-10 17:34:46 +01:00
/// <summary>
/// Lewa zmienna
/// </summary>
public TL Left { get; }
/// <summary>
/// Prawa zmienna
/// </summary>
public TR Right { get; }
/// <summary>
/// Zmienna informujaca czy wykorzystana zostąła zmienna lewa czy prawa
/// </summary>
public bool IsLeft { get; }
/// <summary>
/// Tworzy obiekt typu Either wykorzystując zmienną lewą
/// </summary>
/// <param name="left">Wartość lewej zmiennej</param>
public static implicit operator Either<TL, TR>(TL left) => new Either<TL, TR>(left);
/// <summary>
/// Tworzy obiekt typu Either wykorzystując zmienną prawą
/// </summary>
/// <param name="right">Wartosć prawej zmiennej</param>
public static implicit operator Either<TL, TR>(TR right) => new Either<TL, TR>(right);
2020-12-10 14:31:40 +01:00
/// <summary>
/// Bazowa metoda dopasowania wzorów.
/// Jeśli podana jest wartość lewa, to Match zwróci wynik lewej funkcji, w przeciwnym razie wynik prawej funkcji.
/// </summary>
2020-12-10 17:34:46 +01:00
/// <typeparam name="T">Typ zwracanej wartości</typeparam>
2020-12-10 14:31:40 +01:00
/// <param name="leftFunc">Lewa funkcja </param>
/// <param name="rightFunc">Prawa funkcja</param>
/// <returns>Wynik prawej/lewej funkcji</returns>
2020-12-10 13:15:11 +01:00
public T Match<T>(Func<TL, T> leftFunc, Func<TR, T> rightFunc)
{
if (leftFunc == null)
{
throw new ArgumentNullException(nameof(leftFunc));
}
if (rightFunc == null)
{
throw new ArgumentNullException(nameof(rightFunc));
}
2020-12-10 17:34:46 +01:00
return this.IsLeft ? leftFunc(this.Left) : rightFunc(this.Right);
2020-12-10 13:15:11 +01:00
}
/// <summary>
/// Bazowa metoda dopasowania wzorów.
/// Jeśli podana jest wartość lewa, to Match wykona lewą funkcję, w przeciwnym razie wykona funkcję prawą.
/// </summary>
/// <param name="leftFunc">Lewa funkcja </param>
/// <param name="rightFunc">Prawa funkcja</param>
public void Match(Action<TL> leftFunc, Action<TR> rightFunc)
{
if (leftFunc == null)
{
throw new ArgumentNullException(nameof(leftFunc));
}
if (rightFunc == null)
{
throw new ArgumentNullException(nameof(rightFunc));
}
if (this.IsLeft)
{
leftFunc(this.Left);
}
else
{
rightFunc(this.Right);
}
}
2020-12-10 17:34:46 +01:00
/// <summary>
/// Funkcja ustala czy uzyta została lewa zmienna, jesli tak to zwraca jej wartość inaczej zwraca defaultowy obiekt
/// o typie takim jak lewa zmienna
/// </summary>
/// <returns> Wartosć lewej zmiennej lub defaultową wartość o typie lewej zmiennej</returns>
2020-12-10 13:15:11 +01:00
public TL LeftOrDefault() => this.Match(l => l, r => default(TL));
2020-12-10 17:34:46 +01:00
/// <summary>
/// Funkcja ustala czy uzyta została prawa zmienna, jesli tak to zwraca jej wartość inaczej zwraca defaultowy obiekt
/// o typie takim jak lewa zmienna
/// </summary>
/// <returns> Wartosć lewej zmiennej lub defaultową wartość o typie prawej zmiennej</returns>
2020-12-10 13:15:11 +01:00
public TR RightOrDefault() => this.Match(l => default(TR), r => r);
}
}