2023-10-07 19:13:39 +00:00
|
|
|
|
package option
|
|
|
|
|
|
2024-02-25 13:30:50 +00:00
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
2023-10-07 19:13:39 +00:00
|
|
|
|
// Option permet de définir des valeurs alternative.
|
|
|
|
|
type Choice[T1 any, T2 any] struct {
|
|
|
|
|
left Option[T1]
|
|
|
|
|
right Option[T2]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Left retourne un choix avec la valeur à gauche.
|
|
|
|
|
func Left[T1 any, T2 any](v T1) (c Choice[T1, T2]) {
|
|
|
|
|
c.left = Some(v)
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Right retourne un choix avec la valeur à droite.
|
|
|
|
|
func Right[T1 any, T2 any](v T2) (c Choice[T1, T2]) {
|
|
|
|
|
c.right = Some(v)
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Left retourne la valeur à gauche, si elle existe.
|
|
|
|
|
func (c Choice[T1, T2]) Left() (T1, bool) {
|
|
|
|
|
return c.left.Get()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Right retourne la valeur à droite, si elle existe.
|
|
|
|
|
func (c Choice[T1, T2]) Right() (T2, bool) {
|
|
|
|
|
return c.right.Get()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsLeft retourne vrai si la valeur à gauche est définie.
|
|
|
|
|
func (c Choice[T1, T2]) IsLeft() bool {
|
|
|
|
|
return c.left.IsDefined()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsRight retourne vrai si la valeur à droit est définie.
|
|
|
|
|
func (c Choice[T1, T2]) IsRight() bool {
|
|
|
|
|
return c.right.IsDefined()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsNil retourne vrai si aucune valeur n’est définie.
|
|
|
|
|
func (c Choice[T1, T2]) IsNil() bool {
|
|
|
|
|
return !c.IsLeft() && !c.IsRight()
|
|
|
|
|
}
|
2024-02-25 13:30:50 +00:00
|
|
|
|
|
|
|
|
|
func (c Choice[T1, T2]) String() string {
|
|
|
|
|
return fmt.Sprintf(`{
|
|
|
|
|
left: {
|
|
|
|
|
value: %v,
|
|
|
|
|
ok: %v,
|
|
|
|
|
},
|
|
|
|
|
right: {
|
|
|
|
|
value: %v,
|
|
|
|
|
ok: %v,
|
|
|
|
|
},
|
|
|
|
|
}`, c.left.v, c.left.ok, c.right.v, c.right.ok)
|
|
|
|
|
}
|