package option

type Option[T any] struct {
	hasValue bool
	value    T
}

func Some[T any](value T) Option[T] {
	return Option[T]{
		hasValue: true,
		value:    value,
	}
}

func None[T any]() Option[T] {
	return Option[T]{
		hasValue: false,
	}
}

func (o Option[T]) IsSome() bool {
	return o.hasValue
}

func (o Option[T]) IsNone() bool {
	return !o.hasValue
}

func (o Option[T]) Value() T {
	if !o.hasValue {
		panic("Option has no value")
	}
	return o.value
}

func (o Option[T]) ValueOr(defaultValue T) T {
	if !o.hasValue {
		return defaultValue
	}
	return o.value
}