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;
    }
}