You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
802 B
Go

package main
// type Option[T] = Some(T) | None
type Option[T any] interface {
Match(
caseSome func(value T),
caseNone func(),
)
}
type Some[T any] struct{ Value T }
func (v Some[T]) Match(caseSome func(value T), caseNone func()) {
caseSome(v.Value)
}
type None[T any] struct{}
func (v None[T]) Match(caseSome func(value T), caseNone func()) {
caseNone()
}
// type Either[A, B] = Left A | Right B
type Either[A, B any] interface {
Match(
caseLeft func(value A),
caseRight func(value B),
)
}
type Left[A, B any] struct{ Value A }
func (v Left[A, B]) Match(
caseLeft func(value A),
caseRight func(value B),
) {
caseLeft(v.Value)
}
type Right[A, B any] struct{ Value B }
func (v Right[A, B]) Match(
caseLeft func(value A),
caseRight func(value B),
) {
caseRight(v.Value)
}