using System.Diagnostics.CodeAnalysis; namespace NubLang; public static class Optional { public static Optional Empty() => new(); /// /// Alias for creating an Optional which allows for implicit types /// public static Optional OfNullable(TValue? value) { return value ?? Optional.Empty(); } /// /// Converts a nullable type to an Optional /// public static Optional ToOptional(this TValue? value) { return OfNullable(value); } } public readonly struct Optional { public static Optional Empty() => new(); public static Optional OfNullable(TValue? value) { return value ?? Empty(); } public Optional() { Value = default; HasValue = false; } public Optional(TValue value) { Value = value; HasValue = true; } public TValue? Value { get; } [MemberNotNullWhen(true, nameof(Value))] public bool HasValue { get; } [MemberNotNullWhen(true, nameof(Value))] public bool TryGetValue([NotNullWhen(true)] out TValue? value) { if (HasValue) { value = Value; return true; } value = default; return false; } public TValue GetValue() { return Value ?? throw new InvalidOperationException("Value is not set"); } public static implicit operator Optional(TValue value) => new(value); public TValue Or(TValue other) { if (HasValue) { return Value; } return other; } }