78 lines
1.2 KiB
Go
78 lines
1.2 KiB
Go
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
|
|
}
|