namespace Myriad.Utils;

public interface IOptional
{
    object? GetValue();
}

public readonly struct Optional<T>: IOptional
{
    public Optional(T value)
    {
        HasValue = true;
        Value = value;
    }

    public bool HasValue { get; }
    public object? GetValue() => Value;

    public T Value { get; }

    public static implicit operator Optional<T>(T value) => new(value);

    public static Optional<T> Some(T value) => new(value);
    public static Optional<T> None() => default;
}