feat(type): add Result extension on FutureOr type (close #40) #43

Merged
malo merged 1 commits from type/feature/future_or_support into master 2022-11-24 00:27:22 +00:00
2 changed files with 129 additions and 0 deletions
Showing only changes of commit f36e0b51e0 - Show all commits

View File

@ -16,7 +16,10 @@
// // ignore_for_file: avoid_positional_boolean_parameters
import 'dart:async';
part 'future_result.dart';
part 'future_or_result.dart';
part 'result.dart';
part 'option.dart';

View File

@ -0,0 +1,126 @@
// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
part of 'either_base.dart';
extension FutureOrResultExtension<T, E> on FutureOr<Result<T, E>> {
/// Represents the left side of [Result] class.
Future<bool> get isOk => Future.value(this).then((result) => result.isOk);
/// Represents the right side of [Result] class.
Future<bool> get isErr => Future.value(this).then((result) => result.isErr);
/// Get [U] value, may throw an exception.
Future<U> unwrap<U>() =>
Future.value(this).then((result) => result.unwrap<U>());
/// Get **async** [U] value, may throw an exception.
///
/// With nullable, `Future(Future(U)) == Future(U)`
Future<U> unwrapAsync<U>() =>
Future.value(this).then((result) => result.unwrapAsync<U>());
/// Fold [Ok] and [Err] into the value of one type
Future<U> fold<U>(
U Function(T value) valueTransformer,
U Function(E error) errorTransformer,
) =>
Future.value(this)
.then((result) => result.fold(valueTransformer, errorTransformer));
/// Fold [Ok] and [Err] **asynchronously** into the value of one type
Future<U> foldAsync<U>(
Future<U> Function(T value) valueTransformer,
Future<U> Function(E error) errorTransformer,
) =>
Future.value(this).then(
(result) => result.foldAsync(
valueTransformer,
errorTransformer,
),
);
/// Swap [Ok] and [Err]
Future<Result<E, T>> swap() =>
Future.value(this).then((result) => result.swap());
/// Returns [res] if the [Result] is [Ok], otherwise returns
/// the [Err] value of this.
Future<Result<U, E>> and<U>(Result<U, E> res) =>
Future.value(this).then((result) => result.and(res));
/// Returns [res] if the [Result] is [Err], otherwise returns
/// the [Ok] value of this.
Future<Result<T, F>> or<F>(Result<T, F> res) =>
Future.value(this).then((result) => result.or(res));
/// Returns true if the result is an [Ok] or [Err] value containing
/// the given value/error.
Future<bool> contains<U>(U x) =>
Future.value(this).then((result) => result.contains(x));
/// Returns the contained [Ok] value. Throw [ResultException] on [Err] with
/// its content.
Future<T> expect(String msg) =>
Future.value(this).then((result) => result.expect(msg));
/// Returns the contained [Err] value. Throw [ResultException] on [Ok] with
/// its content.
Future<E> expectErr(String msg) =>
Future.value(this).then((result) => result.expectErr(msg));
/// Maps a [Result<T, E>] to [Result<U, E>] by applying a function to a
/// contained [Ok] value, leaving an [Err] value untouched.
Future<Result<U, E>> map<U>(U Function(T value) mapper) =>
Future.value(this).then((result) => result.map(mapper));
/// Maps a [Result<T, E>] to [Result<U, E>] by applying an **async** function
/// to a contained [Ok] value, leaving an [Err] value untouched.
Future<Result<U, E>> mapAsync<U>(Future<U> Function(T value) mapper) =>
Future.value(this).then((result) => result.mapAsync(mapper));
/// Maps a [Result<T, E>] to [Result<T, F>] by applying a function to a
/// contained [Err] value, leaving an [Ok] value untouched.
Future<Result<T, F>> mapErr<F>(F Function(E error) mapper) =>
Future.value(this).then((result) => result.mapErr(mapper));
/// Maps a [Result<T, E>] to [Result<U, E>] by applying an **async** function
/// to a contained [Err] value, leaving an [Ok] value untouched.
Future<Result<T, F>> mapErrAsync<F>(Future<F> Function(E error) mapper) =>
Future.value(this).then((result) => result.mapErrAsync(mapper));
/// Transforms a [Result<T, E>] to [Result<U, F>] by applying functions to
/// contained [Ok] and [Err] values.
Future<Result<U, F>> either<U, F>(
U Function(T value) valueTransformer,
F Function(E error) errorTransformer,
) =>
Future.value(this)
.then((result) => result.either(valueTransformer, errorTransformer));
/// Transforms a [Result<T, E>] to [Result<U, F>] by applying **async**
/// functions to contained [Ok] and [Err] values.
Future<Result<U, F>> eitherAsync<U, F>(
Future<U> Function(T value) valueTransformer,
Future<F> Function(E error) errorTransformer,
) =>
Future.value(this).then(
(result) => result.eitherAsync(
valueTransformer,
errorTransformer,
),
);
}