package lib; import haxe.Serializer; import haxe.Unserializer; import kernel.fs.FS; import haxe.ds.StringMap; /** Key value store with persistence. **/ class KVStore { private var kvStore: StringMap = new StringMap(); public final namespace:String; public function new(namespace: String) { this.namespace = namespace; this.load(); } public static function removeNamespace(namespace: String): Void { var nsFile = getNamespaceFile(namespace); FS.delete(nsFile); } public static function getStoreForClass(?pos:haxe.PosInfos) { var className = pos.className; return new KVStore(className); } private static function getNamespaceFile(namespace: String): String { return '/var/ns/$namespace'; } public function load() { var nsFile = getNamespaceFile(this.namespace); if (FS.exists(nsFile)){ var handle = FS.openRead(nsFile); parseFile(handle.readAll()); } } public function save() { var handle = FS.openWrite(getNamespaceFile(this.namespace)); handle.write(Serializer.run(this.kvStore)); handle.close(); } private function parseFile(content: String) { var unserializer = new Unserializer(content); this.kvStore = unserializer.unserialize(); } public inline function set(key: String, value: Dynamic) { this.kvStore.set(key,value); } public inline function get(key: String,?orElse:T = null): Null { return this.kvStore.get(key) ?? orElse; } public inline function exists(key: String): Bool { return this.kvStore.exists(key); } public inline function clear() { this.kvStore.clear(); } public inline function remove(key: String): Bool { return this.kvStore.remove(key); } public inline function keys(): Iterator { return this.kvStore.keys(); } public inline function keyValueIterator():KeyValueIterator { return this.kvStore.keyValueIterator(); } }