diff --git a/src/kiss/FuzzyMap.hx b/src/kiss/FuzzyMap.hx index 1ae34aa..b70df26 100644 --- a/src/kiss/FuzzyMap.hx +++ b/src/kiss/FuzzyMap.hx @@ -51,7 +51,12 @@ abstract FuzzyMap(StringMap) from StringMap to StringMap { @:arrayAccess public inline function get(fuzzySearchKey:String):Null { - return this.get(bestMatch(fuzzySearchKey)); + var match = bestMatch(fuzzySearchKey); + var value = this.get(match); + if (match != null) { + FuzzyMapTools.onMatchMade(this, fuzzySearchKey, value); + } + return value; } public inline function remove(fuzzySearchKey:String):Bool { diff --git a/src/kiss/FuzzyMapTools.hx b/src/kiss/FuzzyMapTools.hx new file mode 100644 index 0000000..bba9438 --- /dev/null +++ b/src/kiss/FuzzyMapTools.hx @@ -0,0 +1,39 @@ +package kiss; + +import haxe.Json; +import haxe.ds.StringMap; + +typedef MapInfo = { + file:String, + matches:Map +}; + +/** + * FuzzyMap is highly inefficient, so you may wish to memoize the matches that it makes before + * releasing your project. FuzzyMapTools helps with this + */ +class FuzzyMapTools { + static var serializingMaps = new Map, MapInfo>(); + + public static function serializeMatches(m:StringMap, file:String) { + serializingMaps[m] = { file: file, matches: new Map() }; + } + + @:allow(kiss.FuzzyMap) + static function onMatchMade(m:StringMap, key:String, value:Dynamic) { + #if (sys || hxnodejs) + if (serializingMaps.exists(m)) { + var info = serializingMaps[m]; + info.matches[key] = value; + sys.io.File.saveContent(info.file, Json.stringify(info.matches)); + } + #end + } + + public static function loadMatches(m:StringMap, json:String) { + var savedMatches:haxe.DynamicAccess = Json.parse(json); + for (key => value in savedMatches.keyValueIterator()) { + m.set(key, value); + } + } +} \ No newline at end of file