diff --git a/kiss/src/kiss/FuzzyMap.hx b/kiss/src/kiss/FuzzyMap.hx index 1ae34aa8..b70df26f 100644 --- a/kiss/src/kiss/FuzzyMap.hx +++ b/kiss/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/kiss/src/kiss/FuzzyMapTools.hx b/kiss/src/kiss/FuzzyMapTools.hx new file mode 100644 index 00000000..bba9438b --- /dev/null +++ b/kiss/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 diff --git a/projects/hollywoo/src/hollywoo/Movie.hx b/projects/hollywoo/src/hollywoo/Movie.hx index 67173fbb..ea6745f8 100644 --- a/projects/hollywoo/src/hollywoo/Movie.hx +++ b/projects/hollywoo/src/hollywoo/Movie.hx @@ -10,6 +10,8 @@ import hollywoo.Director; import haxe.Json; import uuid.Uuid; +using kiss.FuzzyMapTools; + enum DelayHandling { Auto; AutoWithSkip; diff --git a/projects/hollywoo/src/hollywoo/Movie.kiss b/projects/hollywoo/src/hollywoo/Movie.kiss index c09070a7..a16dba04 100644 --- a/projects/hollywoo/src/hollywoo/Movie.kiss +++ b/projects/hollywoo/src/hollywoo/Movie.kiss @@ -11,7 +11,6 @@ (prop :FuzzyMap voiceLines (new FuzzyMap)) // Used to give unique, persistent IDs to voice tracks (prop :Map voiceTracksPerActor (new Map)) - (prop :Map matchedVoiceLines (new Map)) (prop &mut :DelayHandling delayHandling AutoWithSkip) @@ -63,9 +62,13 @@ [ // "View" in the Model-View-Controller architecture: &prop :Director director + &opt :String voiceLinesJson ] (set director.movie this) + (voiceLines.serializeMatches "matchedVoiceLines.json") + (when voiceLinesJson + (voiceLines.loadMatches voiceLinesJson)) (super)))