2020-12-10 15:08:05 +01:00
|
|
|
|
using System;
|
2020-12-10 13:15:11 +01:00
|
|
|
|
|
2020-12-10 15:08:05 +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
|
|
|
|
}
|
|
|
|
|
|
2020-12-11 11:10:51 +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);
|
|
|
|
|
}
|
|
|
|
|
}
|