Skip to content

Instantly share code, notes, and snippets.

@sma
Created January 26, 2024 13:36
Show Gist options
  • Save sma/5c7a6a75edb7ee6601459b3367655572 to your computer and use it in GitHub Desktop.
Save sma/5c7a6a75edb7ee6601459b3367655572 to your computer and use it in GitHub Desktop.
A KV that can be observed for changes to key bindings.
/// A KV that can be observed for changes to key bindings.
class ObservableKV {
ObservableKV(this._kv);
final KV _kv;
final _listeners = <void Function(String, Object?)>[];
Stream<(Object, Object?)> observe(String prefix) {
late final StreamController<(Object, Object?)> controller;
void listener(String key, Object? value) {
if (key.startsWith(prefix)) {
controller.sink.add((key, value));
}
}
controller = StreamController<(Object, Object?)>(
onListen: () => _listeners.add(listener),
onCancel: () => _listeners.remove(listener),
);
return controller.stream;
}
Future<Object?> get(String key) => _kv.get(key);
Future<Object?> set(String key, String? value) async {
final old = _kv.set(key, value);
final listeners = _listeners.toList();
scheduleMicrotask(() {
for (final listener in listeners) {
listener(key, value);
}
});
return old;
}
Stream<(String, Object)> list(String prefix) => _kv.list(prefix);
Future<void> snapshot() => _kv.snapshot();
Future<void> dispose() async => _listeners.clear();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment