Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static class Option
- {
- public static Option<T> Some<T>(T item)
- => new Option<T>(item);
- public static Option<T> None<T>()
- => new Option<T>();
- }
- public struct Option<T>
- {
- private readonly T value;
- public Option(T value)
- {
- this.value = value;
- IsSuccessful = value != null;
- }
- public bool IsSuccessful { get; }
- public Option<T> Or(Option<T> other)
- => IsSuccessful ? this : other;
- public T Or(T value)
- => IsSuccessful ? this.value : value;
- public Option<T> Or(Func<Option<T>> other)
- => IsSuccessful ? this : other();
- public T Or(Func<T> other)
- => IsSuccessful ? value : other();
- public Option<U> Select<U>(Func<T, U> f)
- => IsSuccessful ? Option.Some(f(value)) : Option.None<U>();
- public Option<V> SelectMany<U, V>(Func<T, Option<U>> f, Func<T, U, V> g)
- {
- if (!IsSuccessful)
- return Option.None<V>();
- var u = f(value);
- if (u.IsSuccessful)
- return Option.Some(g(value, u.value));
- else
- return Option.None<V>();
- }
- public Option<U> SelectMany<U>(Func<T, Option<U>> f)
- => IsSuccessful ? f(value) : Option.None<U>();
- public Option<T> Where(Func<T, bool> f)
- => IsSuccessful && f(value) ? this : Option.None<T>();
- public R Switch<R>(Func<T, R> some, Func<R> none)
- => IsSuccessful ? some(value) : none();
- public R Switch<R>(Func<T, R> some, R none)
- => IsSuccessful ? some(value) : none;
- public void Switch(Action<T> some, Action none)
- {
- if (IsSuccessful)
- some(value);
- else
- none();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement