mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-31 06:58:42 +01:00
Upstream reformatted its whole tree in 16ddc0837. Matching it removes
formatting from the conflict surface of this and every later sync.
61 lines
1.3 KiB
Dart
61 lines
1.3 KiB
Dart
import 'dart:async';
|
|
import 'package:hive/hive.dart';
|
|
import 'package:mobx/mobx.dart';
|
|
import 'package:cw_core/keyable.dart';
|
|
|
|
|
|
typedef Filter<T> = bool Function(T);
|
|
typedef Transform<T, Y> = Y Function(T);
|
|
|
|
|
|
|
|
|
|
extension MobxBindable<T extends Keyable> on Box<T> {
|
|
|
|
StreamSubscription<BoxEvent> bindToListWithTransform<Y extends Keyable>(
|
|
ObservableList<Y> dest,
|
|
Transform<T, Y> transform, {
|
|
bool initialFire = false,
|
|
Filter<T>? filter,
|
|
}) {
|
|
if (initialFire) {
|
|
dest.addAll(values.map((value) => transform(value)));
|
|
}
|
|
|
|
return watch().listen((event) {
|
|
if (filter != null && event.value != null && !filter(event.value as T)) {
|
|
return;
|
|
}
|
|
|
|
dest.acceptBoxChange(event, transformed: event.deleted ? null : transform(event.value as T));
|
|
});
|
|
}
|
|
}
|
|
|
|
extension HiveBindable<T extends Keyable> on ObservableList<T> {
|
|
|
|
|
|
void acceptBoxChange(BoxEvent event, {T? transformed}) {
|
|
if (event.deleted) {
|
|
removeWhere((el) {
|
|
return el.keyIndex == event.key;
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
final dynamic value = transformed ?? event.value;
|
|
|
|
if (value is T) {
|
|
final index = indexWhere((el) => el.keyIndex == value.keyIndex);
|
|
|
|
if (index > -1) {
|
|
this.setAll(index, [value]); // FIXME: fixme
|
|
} else {
|
|
add(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|