feat(proj): init

This commit is contained in:
vl.arkhangelskii
2026-09-21 04:06:43 +03:00
commit c956b94983
1076 changed files with 50876 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
/// Minimal async state container so screens can pattern-match over
/// loading / data / error instead of juggling three nullable fields.
sealed class AsyncValue<T> {
const AsyncValue();
const factory AsyncValue.loading() = AsyncLoading<T>;
const factory AsyncValue.data(T value) = AsyncData<T>;
const factory AsyncValue.error(String message) = AsyncError<T>;
T? get valueOrNull => this is AsyncData<T> ? (this as AsyncData<T>).value : null;
bool get isLoading => this is AsyncLoading<T>;
R map<R>({
required R Function() loading,
required R Function(T value) data,
required R Function(String message) error,
}) {
return switch (this) {
AsyncLoading<T>() => loading(),
AsyncData<T>(value: final v) => data(v),
AsyncError<T>(message: final m) => error(m),
};
}
}
final class AsyncLoading<T> extends AsyncValue<T> {
const AsyncLoading();
}
final class AsyncData<T> extends AsyncValue<T> {
const AsyncData(this.value);
final T value;
}
final class AsyncError<T> extends AsyncValue<T> {
const AsyncError(this.message);
final String message;
}