Skip to content

Commit

Permalink
Merge pull request #8853 from Roasbeef/result-utils
Browse files Browse the repository at this point in the history
fn: add additional utility methods for Result[T]
  • Loading branch information
Roasbeef authored Jun 20, 2024
2 parents 390f072 + f1a3871 commit 376b8ce
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions fn/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ type Result[T any] struct {
Either[T, error]
}

// NewResult creates a new result from a (value, error) tuple.
func NewResult[T any](val T, err error) Result[T] {
if err != nil {
return Err[T](err)
}

return Ok(val)
}

// Ok creates a new Result with a success value.
func Ok[T any](val T) Result[T] {
return Result[T]{Either: NewLeft[T, error](val)}
Expand All @@ -33,6 +42,11 @@ func (r Result[T]) Unpack() (T, error) {
return r.left.UnwrapOr(zero), r.right.UnwrapOr(nil)
}

// Err exposes the underlying error of the result type as a normal error type.
func (r Result[T]) Err() error {
return r.right.some
}

// IsOk returns true if the Result is a success value.
func (r Result[T]) IsOk() bool {
return r.IsLeft()
Expand Down Expand Up @@ -140,3 +154,15 @@ func FlatMap[A, B any](r Result[A], f func(A) Result[B]) Result[B] {
func AndThen[A, B any](r Result[A], f func(A) Result[B]) Result[B] {
return FlatMap(r, f)
}

// AndThen2 applies a function that returns a Result[C] to the success values
// of two Result types if both exist.
func AndThen2[A, B, C any](ra Result[A], rb Result[B],
f func(A, B) Result[C]) Result[C] {

return AndThen(ra, func(a A) Result[C] {
return AndThen(rb, func(b B) Result[C] {
return f(a, b)
})
})
}

0 comments on commit 376b8ce

Please sign in to comment.