Skip to content

Instantly share code, notes, and snippets.

@stargazing-dino
Created January 9, 2021 20:22
Show Gist options
  • Save stargazing-dino/99435fd26d2c1be447e7946ddab0720b to your computer and use it in GitHub Desktop.
Save stargazing-dino/99435fd26d2c1be447e7946ddab0720b to your computer and use it in GitHub Desktop.
Combines AsyncValues for use with Riverpod
import 'package:hooks_riverpod/all.dart';
import 'package:tuple/tuple.dart';
AsyncValue<Tuple2<T, R>> combineAsync2<T, R>(
AsyncValue<T> asyncOne,
AsyncValue<R> asyncTwo,
) {
if (asyncOne is AsyncError) {
final error = asyncOne as AsyncError<T>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncTwo is AsyncError) {
final error = asyncTwo as AsyncError<R>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncOne is AsyncLoading || asyncTwo is AsyncLoading) {
return AsyncLoading();
} else if (asyncOne is AsyncData && asyncTwo is AsyncData) {
return AsyncData(Tuple2<T, R>(asyncOne.data.value, asyncTwo.data.value));
} else {
throw 'Unsupported case';
}
}
AsyncValue<Tuple3<T, R, S>> combineAsync3<T, R, S>(
AsyncValue<T> asyncOne,
AsyncValue<R> asyncTwo,
AsyncValue<S> asyncThree,
) {
if (asyncOne is AsyncError) {
final error = asyncOne as AsyncError<T>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncTwo is AsyncError) {
final error = asyncTwo as AsyncError<R>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncThree is AsyncError) {
final error = asyncThree as AsyncError<S>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncOne is AsyncLoading ||
asyncTwo is AsyncLoading ||
asyncThree is AsyncLoading) {
return AsyncLoading();
} else if (asyncOne is AsyncData &&
asyncTwo is AsyncData &&
asyncThree is AsyncData) {
return AsyncData(Tuple3<T, R, S>(
asyncOne.data.value,
asyncTwo.data.value,
asyncThree.data.value,
));
} else {
throw 'Unsupported case';
}
}
AsyncValue<Tuple4<T, R, S, Q>> combineAsync4<T, R, S, Q>(
AsyncValue<T> asyncOne,
AsyncValue<R> asyncTwo,
AsyncValue<S> asyncThree,
AsyncValue<Q> asyncFour,
) {
if (asyncOne is AsyncError) {
final error = asyncOne as AsyncError<T>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncTwo is AsyncError) {
final error = asyncTwo as AsyncError<R>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncThree is AsyncError) {
final error = asyncThree as AsyncError<S>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncFour is AsyncError) {
final error = asyncFour as AsyncError<Q>;
return AsyncError(error.error, error.stackTrace);
} else if (asyncOne is AsyncLoading ||
asyncTwo is AsyncLoading ||
asyncThree is AsyncLoading ||
asyncFour is AsyncLoading) {
return AsyncLoading();
} else if (asyncOne is AsyncData &&
asyncTwo is AsyncData &&
asyncThree is AsyncData &&
asyncFour is AsyncData) {
return AsyncData(Tuple4<T, R, S, Q>(
asyncOne.data.value,
asyncTwo.data.value,
asyncThree.data.value,
asyncFour.data.value,
));
} else {
throw 'Unsupported case';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment