diff --git a/lib/src/result.dart b/lib/src/result.dart index 0945b9a..fd18fda 100644 --- a/lib/src/result.dart +++ b/lib/src/result.dart @@ -38,6 +38,8 @@ abstract class Result { /// Calls `f` if the result is `Ok`, otherwise returns the `Err` value of self. /// /// This method can be used for control flow based on Result values. + /// + /// Example: /// ``` /// Result getReciprocal(double n) => tryCatch(() => 1 / n); /// @@ -51,6 +53,14 @@ abstract class Result { (error) => Err(error), ); + /// Calls `f` if the result is `Err`, otherwise returns the `Ok` value of self. + /// + /// This method can be used for control flow based on Result values. + Result flatMapErr(Result Function(E error) f) => fold( + (value) => Ok(value), + (error) => f(error), + ); + /// Converts from `Result` to `B` by applying a function `ifOk` to a contained `Ok` value and a function `ifErr` to a contained `Err` value. B fold(B Function(T value) ifOk, B Function(E error) ifErr); diff --git a/test/result_test.dart b/test/result_test.dart index fc89820..4ed724c 100644 --- a/test/result_test.dart +++ b/test/result_test.dart @@ -53,6 +53,17 @@ void main() { expect(err.flatMap((value) => Ok(value)), err); }); + test('flatMapErr works correctly', () { + final ok = Ok(42); + final err = Err('error'); + + expect(ok.flatMapErr((value) => Err(value)), Ok(42)); + expect( + err.flatMapErr((value) => Err('Error: $value')), + Err('Error: error'), + ); + }); + test('mapErr works correctly', () { final ok = Ok(42); final err = Err('error');