diff --git a/Functional/Option.cs b/Functional/Option.cs index f414214..a88c908 100644 --- a/Functional/Option.cs +++ b/Functional/Option.cs @@ -20,6 +20,7 @@ public readonly struct Option : IOption, public T? Value => _value; [MemberNotNullWhen(true, nameof(HasValue), nameof(_value))] + [MemberNotNullWhen(true, nameof(HasValue), nameof(Value))] public bool HasValue {get;init;} public static Option Some(T value) => new Option(value, true); diff --git a/Functional/OptionExtensions.cs b/Functional/OptionExtensions.cs index d4c56f5..1137e65 100644 --- a/Functional/OptionExtensions.cs +++ b/Functional/OptionExtensions.cs @@ -1,5 +1,7 @@ using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Numerics; +using Microsoft.VisualBasic; namespace SJK.Functional; @@ -97,6 +99,27 @@ public static partial class OptionExtensions } return Option.None; } + public static bool HasValue(this Option option,[NotNullWhen(true)] out T result) + { + result = option.Value!; + return option.HasValue; + } + public static bool IfSome(this Option option, Action action) + { + if (option.HasValue) + { + action(option.Value); + } + return option.HasValue; + } + public static bool IfNone(this Option option, Action action) + { + if (!option.HasValue) + { + action(); + } + return !option.HasValue; + } public static Option ToOption(this T? value) => value is null ? Option.None : Option.Some(value);