Created
January 26, 2024 13:36
-
-
Save sma/5c7a6a75edb7ee6601459b3367655572 to your computer and use it in GitHub Desktop.
A KV that can be observed for changes to key bindings.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// 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