Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
-
- namespace Nulls
- {
- public struct Maybe<T> : IEquatable<Maybe<T>>
- where T : class
- {
- private readonly T _value;
- public T Value
- {
- get
- {
- if (HasNoValue) throw new InvalidOperationException();
-
- return _value;
- }
- }
-
- public bool HasValue => _value != null;
-
- public bool HasNoValue => !HasNoValue;
-
- private Maybe(T value)
- {
- _value = value;
- }
-
- public static implicit operator Maybe<T> (T value)
- {
- return new Maybe<T>(value);
- }
-
- public static bool operator ==(Maybe<T> first, Maybe<T> second)
- {
- return first.Equals(second);
- }
-
- public static bool operator !=(Maybe<T> first, Maybe<T> second)
- {
- return !(first == second);
- }
-
- public static bool operator !=(Maybe<T> maybe, T value)
- {
- return !(maybe == value);
- }
-
- public override bool Equals(object obj)
- {
- if (!(obj is Maybe<T>)) return false;
-
- var other = (Maybe<T>) obj;
- return Equals(other);
- }
-
- public bool Equals(Maybe<T> other)
- {
- if (HasNoValue && other.HasNoValue) return true;
-
- if (HasNoValue || other.HasNoValue) return false;
-
- return _value.Equals(othe._value);
- }
-
- public override int GetHashCode()
- {
- return _value.GetHashCode();
- }
-
- public override string ToString()
- {
- if (HasNoValue) return string.Empty;
-
- return Value.ToString();
- }
-
- public T Unwrap(T defaultValue = default(T))
- {
- if (HasValue) return Value;
-
- return defaultValue;
- }
-
- }
-
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement