using System; namespace DiscordBotCore.Others { public class OneOf { public T0 Item0 { get; } public T1 Item1 { get; } public object? Value => Item0 != null ? Item0 : Item1; public OneOf(T0 item0) { Item0 = item0; } public OneOf(T1 item1) { Item1 = item1; } public static implicit operator OneOf(T0 item0) => new OneOf(item0); public static implicit operator OneOf(T1 item1) => new OneOf(item1); public void Match(Action item0, Action item1) { if (Item0 != null) item0(Item0); else item1(Item1); } public TResult Match(Func item0, Func item1) { return Item0 != null ? item0(Item0) : item1(Item1); } public Type GetActualType() { return Item0 != null ? Item0.GetType() : Item1.GetType(); } } public class OneOf { public T0 Item0 { get; } public T1 Item1 { get; } public T2 Item2 { get; } public OneOf(T0 item0) { Item0 = item0; } public OneOf(T1 item1) { Item1 = item1; } public OneOf(T2 item2) { Item2 = item2; } public static implicit operator OneOf(T0 item0) => new OneOf(item0); public static implicit operator OneOf(T1 item1) => new OneOf(item1); public static implicit operator OneOf(T2 item2) => new OneOf(item2); public void Match(Action item0, Action item1, Action item2) { if (Item0 != null) item0(Item0); else if (Item1 != null) item1(Item1); else item2(Item2); } public TResult Match(Func item0, Func item1, Func item2) { return Item0 != null ? item0(Item0) : Item1 != null ? item1(Item1) : item2(Item2); } } public class OneOf { public T0 Item0 { get; } public T1 Item1 { get; } public T2 Item2 { get; } public T3 Item3 { get; } public OneOf(T0 item0) { Item0 = item0; } public OneOf(T1 item1) { Item1 = item1; } public OneOf(T2 item2) { Item2 = item2; } public OneOf(T3 item3) { Item3 = item3; } public static implicit operator OneOf(T0 item0) => new OneOf(item0); public static implicit operator OneOf(T1 item1) => new OneOf(item1); public static implicit operator OneOf(T2 item2) => new OneOf(item2); public static implicit operator OneOf(T3 item3) => new OneOf(item3); public void Match(Action item0, Action item1, Action item2, Action item3) { if (Item0 != null) item0(Item0); else if (Item1 != null) item1(Item1); else if (Item2 != null) item2(Item2); else item3(Item3); } public TResult Match(Func item0, Func item1, Func item2, Func item3) { return Item0 != null ? item0(Item0) : Item1 != null ? item1(Item1) : Item2 != null ? item2(Item2) : item3(Item3); } } }