package main import "fmt" func main1() { name := Map(getUser(100), getName).OrElse("-") fmt.Println(name) value := Map(Map(getUser(200), getCard), getValue).OrElse(0) fmt.Println(value) } func getUser(id int) Maybe[User] { if id == 100 { return None[User]() } user := User{ Name: "Test", Card: &Card{Value: 100}, } return Some[User](user) } func getCard(user User) Maybe[Card] { if user.Card != nil { return Some[Card](*user.Card) } return None[Card]() } func getValue(card Card) Maybe[int] { return Some[int](card.Value) } func getName(user User) Maybe[string] { return Some[string](user.Name) } type User struct { Name string Card *Card } type Card struct { Value int } type Maybe[T any] struct { value T present bool } func Some[T any](value T) Maybe[T] { return Maybe[T]{value: value, present: true} } func None[T any]() Maybe[T] { return Maybe[T]{present: false} } func Map[T, R any](m Maybe[T], fn func(T) Maybe[R]) Maybe[R] { if m.present { return fn(m.value) } return None[R]() } func (m Maybe[T]) IsPresent() bool { return m.present } func (m Maybe[T]) OrElse(defaultValue T) T { if m.present { return m.value } return defaultValue }