package option

// Result stocke un résultat :
// - soit le résultat est valide, et une valeur est stockée,
// - soit le résultat est invalide, et une erreur est stockée.
type Result[T any] struct {
	v   T
	err error
	ok  bool
}

// Ok retourne un résultat valide.
func Ok[T any](v T) (r Result[T]) {
	r.v, r.ok = v, true
	return
}

// Err retourne un résultat invalide.
func Err[T any](err error) (r Result[T]) {
	r.err = err
	return
}

// Ok retourne la valeur du résultat, et vrai si c’est un résultat valide.
func (r Result[T]) Ok() (v T, ok bool) {
	if ok = r.ok; ok {
		v = r.v
	}
	return
}

// Err retourne l’erreur du résultat, et vrai si c’est un résultat invalide.
func (r Result[T]) Err() (err error, ok bool) {
	if ok = !r.ok; ok {
		err = r.err
	}
	return
}

// IsOk retourne vrai si le résultat est valide.
func (r Result[T]) IsOk() bool {
	return r.ok
}
