OneOf.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. /// <summary>
  14. /// 对不同类型执行不同的操作,并返回同一个值。
  15. /// </summary>
  16. public TResult Switch<TResult>(Func<T0, TResult> f0, Func<T1, TResult> f1) => _index switch {
  17. 0 => f0(_value0!), _ => f1(_value1!)
  18. };
  19. /// <summary>
  20. /// 对不同类型执行不同的操作。
  21. /// </summary>
  22. public void Switch(Action<T0> f0, Action<T1> f1) {
  23. if (_index == 0) f0(_value0!);
  24. else if (_index == 1) f1(_value1!);
  25. }
  26. /// <summary>
  27. /// 判断当前的类型是否为 T。
  28. /// </summary>
  29. public bool Is<T>() => _index switch {
  30. 0 when typeof(T) == typeof(T0) => true,
  31. 1 when typeof(T) == typeof(T1) => true,
  32. _ => false
  33. };
  34. /// <summary>
  35. /// 假定当前的类型为 T,并返回该值。
  36. /// 若当前值的类型不为 T,则抛出 InvalidOperationException。
  37. /// </summary>
  38. public T As<T>() => _index switch {
  39. 0 when typeof(T) == typeof(T0) => (T)(object)_value0!,
  40. 1 when typeof(T) == typeof(T1) => (T)(object)_value1!,
  41. _ => throw new InvalidOperationException()
  42. };
  43. }
  44. public readonly struct OneOf<T0, T1, T2> {
  45. private readonly int _index;
  46. private readonly T0? _value0;
  47. private readonly T1? _value1;
  48. private readonly T2? _value2;
  49. public static implicit operator OneOf<T0, T1, T2>(T0 value) => new(0, value, default, default);
  50. public static implicit operator OneOf<T0, T1, T2>(T1 value) => new(1, default, value, default);
  51. public static implicit operator OneOf<T0, T1, T2>(T2 value) => new(2, default, default, value);
  52. private OneOf(int index, T0? value0, T1? value1, T2? value2) {
  53. _index = index;
  54. _value0 = value0;
  55. _value1 = value1;
  56. _value2 = value2;
  57. }
  58. /// <summary>
  59. /// 对不同类型执行不同的操作,并返回同一个值。
  60. /// </summary>
  61. public TResult Switch<TResult>(Func<T0, TResult> f0, Func<T1, TResult> f1, Func<T2, TResult> f2) => _index switch {
  62. 0 => f0(_value0!), 1 => f1(_value1!), _ => f2(_value2!)
  63. };
  64. /// <summary>
  65. /// 对不同类型执行不同的操作。
  66. /// </summary>
  67. public void Switch(Action<T0> f0, Action<T1> f1, Action<T2> f2) {
  68. if (_index == 0) f0(_value0!);
  69. else if (_index == 1) f1(_value1!);
  70. else if (_index == 2) f2(_value2!);
  71. }
  72. /// <summary>
  73. /// 判断当前的类型是否为 T。
  74. /// </summary>
  75. public bool Is<T>() => _index switch {
  76. 0 when typeof(T) == typeof(T0) => true,
  77. 1 when typeof(T) == typeof(T1) => true,
  78. 2 when typeof(T) == typeof(T2) => true,
  79. _ => false
  80. };
  81. /// <summary>
  82. /// 假定当前的类型为 T,并返回该值。
  83. /// 若当前值的类型不为 T,则抛出 InvalidOperationException。
  84. /// </summary>
  85. public T As<T>() => _index switch {
  86. 0 when typeof(T) == typeof(T0) => (T) (object) _value0!,
  87. 1 when typeof(T) == typeof(T1) => (T) (object) _value1!,
  88. 2 when typeof(T) == typeof(T2) => (T) (object) _value2!,
  89. _ => throw new InvalidOperationException()
  90. };
  91. }