Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5.  
  6. namespace Toy_Option
  7. {
  8.  
  9. public abstract class Option<T> : IEnumerable<T>
  10. {
  11. public abstract IEnumerator<T> GetEnumerator();
  12.  
  13. IEnumerator IEnumerable.GetEnumerator()
  14. {
  15. throw new NotImplementedException();
  16. }
  17.  
  18. public abstract T GetOrElse(T orElse);
  19.  
  20. public static Option<T> None => new None<T>();
  21.  
  22. public static Option<T> FromEnumerable(IEnumerable<T> input)
  23. {
  24. if (input == null) return Option<T>.None as Option<T>;
  25. if (input.Count() == 0) return Option<T>.None as Option<T>;
  26. return new Some<T>(input.First());
  27. }
  28.  
  29. public bool IsDefined
  30. {
  31. get
  32. {
  33. if (this is None<T>) return false;
  34. return (this.Count() > 0);
  35. }
  36. }
  37.  
  38. public bool IsEmpty
  39. {
  40. get { return !IsDefined; }
  41. }
  42. }
  43.  
  44. public class Some<T> : Option<T>, IEquatable<Some<T>>
  45. {
  46. private readonly List<T> _list = new List<T>();
  47.  
  48. public override T GetOrElse(T orElse) => _list.Count == 0 ? orElse : _list[0];
  49.  
  50. public Some(T value) => _list.Add(value);
  51.  
  52. // implement IEnumerable<T>
  53.  
  54. public override IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
  55.  
  56. public override bool Equals(object obj)
  57. {
  58. return Equals(obj as Some<T>);
  59. }
  60.  
  61. // implement IEquatable<Some<T>>
  62.  
  63. public bool Equals(Some<T> other)
  64. {
  65. return other != null &&
  66. EqualityComparer<List<T>>.Default.Equals(_list, other._list);
  67. }
  68.  
  69. public override int GetHashCode()
  70. {
  71. return -595181494 + EqualityComparer<List<T>>.Default.GetHashCode(_list);
  72. }
  73.  
  74. public static bool operator ==(Some<T> left, Some<T> right)
  75. {
  76. return EqualityComparer<Some<T>>.Default.Equals(left, right);
  77. }
  78.  
  79. public static bool operator !=(Some<T> left, Some<T> right)
  80. {
  81. return !(left == right);
  82. }
  83. }
  84.  
  85. public class None<T> : Option<T>, IEquatable<None<T>>
  86. {
  87. private readonly List<T> _list = new List<T>();
  88.  
  89. public override T GetOrElse(T orElse) => orElse;
  90.  
  91. // implement IEnumerable<T>
  92.  
  93. public override IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
  94.  
  95. // implement IEquatable<None<T>
  96.  
  97. public override bool Equals(object obj)
  98. {
  99. return Equals(obj as None<T>);
  100. }
  101.  
  102. public bool Equals(None<T> other)
  103. {
  104. return other != null &&
  105. EqualityComparer<List<T>>.Default.Equals(_list, other._list);
  106. }
  107.  
  108. public override int GetHashCode()
  109. {
  110. return -595181494 + EqualityComparer<List<T>>.Default.GetHashCode(_list);
  111. }
  112.  
  113. public static bool operator ==(None<T> left, None<T> right)
  114. {
  115. return EqualityComparer<None<T>>.Default.Equals(left, right);
  116. }
  117.  
  118. public static bool operator !=(None<T> left, None<T> right)
  119. {
  120. return !(left == right);
  121. }
  122. }
  123.  
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement