using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace SJK.Functional; public sealed class None : IOption { public static None Of() => new(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public TResult Match(Func _, Func onNone) => onNone(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Match(Action onSome, Action onNone) => onNone(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public IOption Bind(Func> f) => new None(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public IOption Map(Func f) => new None(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public T Or(T aDefault) => aDefault; public T Or(Func aDefault)=>aDefault(); public bool HasValue([NotNullWhen(true)]out T? value) => (value = default) is not null && false; public bool HasValue() => false; public override string ToString() { return nameof(None); } public bool Equals(IOption? other)=> other is None; }