Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. using System;
  2. namespace Nulls
  3. {
  4. public struct Maybe<T> : IEquatable<Maybe<T>>
  5. where T : class
  6. {
  7. private readonly T _value;
  8. public T Value
  9. {
  10. get
  11. {
  12. if (HasNoValue) throw new InvalidOperationException();
  13. return _value;
  14. }
  15. }
  16. public bool HasValue => _value != null;
  17. public bool HasNoValue => !HasNoValue;
  18. private Maybe(T value)
  19. {
  20. _value = value;
  21. }
  22. public static implicit operator Maybe<T> (T value)
  23. {
  24. return new Maybe<T>(value);
  25. }
  26. public static bool operator ==(Maybe<T> first, Maybe<T> second)
  27. {
  28. return first.Equals(second);
  29. }
  30. public static bool operator !=(Maybe<T> first, Maybe<T> second)
  31. {
  32. return !(first == second);
  33. }
  34. public static bool operator !=(Maybe<T> maybe, T value)
  35. {
  36. return !(maybe == value);
  37. }
  38. public override bool Equals(object obj)
  39. {
  40. if (!(obj is Maybe<T>)) return false;
  41. var other = (Maybe<T>) obj;
  42. return Equals(other);
  43. }
  44. public bool Equals(Maybe<T> other)
  45. {
  46. if (HasNoValue && other.HasNoValue) return true;
  47. if (HasNoValue || other.HasNoValue) return false;
  48. return _value.Equals(othe._value);
  49. }
  50. public override int GetHashCode()
  51. {
  52. return _value.GetHashCode();
  53. }
  54. public override string ToString()
  55. {
  56. if (HasNoValue) return string.Empty;
  57. return Value.ToString();
  58. }
  59. public T Unwrap(T defaultValue = default(T))
  60. {
  61. if (HasValue) return Value;
  62. return defaultValue;
  63. }
  64. }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement