Skip to content

Commit

Permalink
feat: add OrElse()
Browse files Browse the repository at this point in the history
isac322 committed Dec 8, 2022

Verified

This commit was signed with the committer’s verified signature.
mcollina Matteo Collina
1 parent 9202070 commit 175be4e
Showing 4 changed files with 31 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -61,6 +61,7 @@ and more detailed examples are here: [./examples_test.go](./examples_test.go).
- [Option[T]#TakeOr(fallbackValue T) T](https://pkg.go.dev/github.com/moznion/go-optional#Option.TakeOr)
- [Option[T]#TakeOrElse(fallbackFunc func() T) T](https://pkg.go.dev/github.com/moznion/go-optional#Option.TakeOrElse)
- [Option[T]#Or(fallbackOptionValue Option[T]) Option[T]](https://pkg.go.dev/github.com/moznion/go-optional#Option.Or)
- [Option[T]#OrElse(fallbackOptionFunc func() Option[T]) Option[T]](https://pkg.go.dev/github.com/moznion/go-optional#Option.OrElse)
- [Option[T]#Filter(predicate func(v T) bool) Option[T]](https://pkg.go.dev/github.com/moznion/go-optional#Option.Filter)
- [Option[T]#IfSome(f func(v T))](https://pkg.go.dev/github.com/moznion/go-optional#Option.IfSome)
- [Option[T]#IfSomeWithError(f func(v T) error) error](https://pkg.go.dev/github.com/moznion/go-optional#Option.IfSomeWithError)
14 changes: 14 additions & 0 deletions examples_test.go
Original file line number Diff line number Diff line change
@@ -564,3 +564,17 @@ func ExampleOption_Or() {
// Some[actual]
// Some[fallback]
}

func ExampleOption_OrElse() {
fallbackFunc := func() Option[string] { return Some[string]("fallback") }

some := Some[string]("actual")
fmt.Printf("%s\n", some.OrElse(fallbackFunc))

none := None[string]()
fmt.Printf("%s\n", none.OrElse(fallbackFunc))

// Output:
// Some[actual]
// Some[fallback]
}
9 changes: 9 additions & 0 deletions option.go
Original file line number Diff line number Diff line change
@@ -111,6 +111,15 @@ func (o Option[T]) Or(fallbackOptionValue Option[T]) Option[T] {
return o
}

// OrElse returns the Option value according to the actual value existence.
// If the receiver's Option value is Some, this function pass-through that to return. Otherwise, this executes `fallbackOptionFunc` and returns the result value of that function.
func (o Option[T]) OrElse(fallbackOptionFunc func() Option[T]) Option[T] {
if o.IsNone() {
return fallbackOptionFunc()
}
return o
}

// Filter returns self if the Option has a value and the value matches the condition of the predicate function.
// In other cases (i.e. it doesn't match with the predicate or the Option is None), this returns None value.
func (o Option[T]) Filter(predicate func(v T) bool) Option[T] {
7 changes: 7 additions & 0 deletions option_test.go
Original file line number Diff line number Diff line change
@@ -575,3 +575,10 @@ func TestOption_Or(t *testing.T) {
assert.EqualValues(t, Some[string]("actual").Or(fallback).Unwrap(), "actual")
assert.EqualValues(t, None[string]().Or(fallback).Unwrap(), "fallback")
}

func TestOption_OrElse(t *testing.T) {
fallbackFunc := func() Option[string] { return Some[string]("fallback") }

assert.EqualValues(t, Some[string]("actual").OrElse(fallbackFunc).Unwrap(), "actual")
assert.EqualValues(t, None[string]().OrElse(fallbackFunc).Unwrap(), "fallback")
}

0 comments on commit 175be4e

Please sign in to comment.