OneOf.cs 1.8 KB

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