Option
Option provides an Option container which can be used to force some additional presence assertions on values.
Example
Having:
type User struct {
Name string
Age int
}
defaultUser := User{Name: "A", Age: 1}
aUser := User{Name: "B", Age: 2}
Unpack Some[User]:
// option.Option[User]
maybeUser := option.O(aUser)
// option is a user, use value, ignore default
user := maybeUser.Default(defaultUser)
fmt.Println(user == aUser) // => true
Call a function if Option is Some:
// option.Option[User]
maybeUser := option.O(aUser)
maybeUser.Some(func(u User) {
fmt.Println("name: ", u.Name)
}) // name: B
Unpack None[User]:
maybeUser := option.O[User]() // option.None[User]
// No user, use default
user := maybeUser.Default(defaultUser)
fmt.Println(user == defaultUser) // => true
Unpack None[User] (verbose):
user := maybeUser.Switchv(
func(u User) User { return u },
func() User { return defaultUser })
fmt.Println(user == defaultUser) // => true
Switch on Option:
maybeUser := option.O(aUser)
maybeUser.Switch(
func(u User) {
fmt.Printf("Got a user %s, aged %d\n", u.Name, u.Age)
},
func() {
fmt.Println("Got nothing")
})
Iterate
opts := option.Slice[User](
User{Name: "Douglas", Age: 42},
User{Name: "Neil", Age: 61},
)
opts.EachPtr(func(s *User) {
s.Age*=2
})
opts.Each(func(s User) {
fmt.Println(s)
})
// => {Douglas 84}
// => {Neil 122}
ultimateWriter := option.FoldIdxl(opts, func(i int, res User, next User) User {
if i != len(opts)-1 {
res.Name += next.Name + " "
}
res.Age += next.Age
return res
}, User{})
fmt.Println(ultimateWriter) // {Douglas Neil 206}