OneOf.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System;
  2. namespace MeloongCore;
  3. public readonly struct OneOf<T0, T1> {
  4. private readonly int _index;
  5. private readonly T0 _value0;
  6. private readonly T1 _value1;
  7. public static implicit operator OneOf<T0, T1>(T0 value) => new(0, value, default);
  8. public static implicit operator OneOf<T0, T1>(T1 value) => new(1, default, value);
  9. private OneOf(int index, T0 value0, T1 value1) {
  10. _index = index;
  11. _value0 = value0;
  12. _value1 = value1;
  13. }
  14. public TResult Match<TResult>(Func<T0, TResult> f0, Func<T1, TResult> f1) =>
  15. _index switch {0 => f0(_value0), _ => f1(_value1)};
  16. public void Switch(Action<T0> f0, Action<T1> f1) {
  17. if (_index == 0) f0(_value0);
  18. else if (_index == 1) f1(_value1);
  19. }
  20. }
  21. public readonly struct OneOf<T0, T1, T2> {
  22. private readonly int _index;
  23. private readonly T0 _value0;
  24. private readonly T1 _value1;
  25. private readonly T2 _value2;
  26. public static implicit operator OneOf<T0, T1, T2>(T0 value) => new(0, value, default, default);
  27. public static implicit operator OneOf<T0, T1, T2>(T1 value) => new(1, default, value, default);
  28. public static implicit operator OneOf<T0, T1, T2>(T2 value) => new(2, default, default, value);
  29. private OneOf(int index, T0 value0, T1 value1, T2 value2) {
  30. _index = index;
  31. _value0 = value0;
  32. _value1 = value1;
  33. _value2 = value2;
  34. }
  35. public TResult Match<TResult>(Func<T0, TResult> f0, Func<T1, TResult> f1, Func<T2, TResult> f2) =>
  36. _index switch {0 => f0(_value0), 1 => f1(_value1), _ => f2(_value2)};
  37. public void Switch(Action<T0> f0, Action<T1> f1, Action<T2> f2) {
  38. if (_index == 0) f0(_value0);
  39. else if (_index == 1) f1(_value1);
  40. else if (_index == 2) f2(_value2);
  41. }
  42. }