pink_fox/application/ttt.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
}