Skip to content

Commit

Permalink
feat: add OrElse()
Browse files Browse the repository at this point in the history
  • Loading branch information
isac322 committed Dec 8, 2022
1 parent 9202070 commit 175be4e
Show file tree
Hide file tree
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
Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Up @@ -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] {
Expand Down
7 changes: 7 additions & 0 deletions option_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.