Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. public static class Option
  2. {
  3. public static Option<T> Some<T>(T item)
  4. => new Option<T>(item);
  5. public static Option<T> None<T>()
  6. => new Option<T>();
  7. }
  8. public struct Option<T>
  9. {
  10. private readonly T value;
  11.  
  12. public Option(T value)
  13. {
  14. this.value = value;
  15. IsSuccessful = value != null;
  16. }
  17. public bool IsSuccessful { get; }
  18.  
  19. public Option<T> Or(Option<T> other)
  20. => IsSuccessful ? this : other;
  21. public T Or(T value)
  22. => IsSuccessful ? this.value : value;
  23. public Option<T> Or(Func<Option<T>> other)
  24. => IsSuccessful ? this : other();
  25. public T Or(Func<T> other)
  26. => IsSuccessful ? value : other();
  27. public Option<U> Select<U>(Func<T, U> f)
  28. => IsSuccessful ? Option.Some(f(value)) : Option.None<U>();
  29. public Option<V> SelectMany<U, V>(Func<T, Option<U>> f, Func<T, U, V> g)
  30. {
  31. if (!IsSuccessful)
  32. return Option.None<V>();
  33. var u = f(value);
  34. if (u.IsSuccessful)
  35. return Option.Some(g(value, u.value));
  36. else
  37. return Option.None<V>();
  38. }
  39. public Option<U> SelectMany<U>(Func<T, Option<U>> f)
  40. => IsSuccessful ? f(value) : Option.None<U>();
  41. public Option<T> Where(Func<T, bool> f)
  42. => IsSuccessful && f(value) ? this : Option.None<T>();
  43.  
  44. public R Switch<R>(Func<T, R> some, Func<R> none)
  45. => IsSuccessful ? some(value) : none();
  46. public R Switch<R>(Func<T, R> some, R none)
  47. => IsSuccessful ? some(value) : none;
  48. public void Switch(Action<T> some, Action none)
  49. {
  50. if (IsSuccessful)
  51. some(value);
  52. else
  53. none();
  54. }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement