From 863dc3bdfae0005c87b5efdc5f10496d2a3754e3 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 4 Dec 2021 17:34:27 -0700 Subject: [PATCH] Fuzzy map type --- kiss/haxelib.json | 3 ++- kiss/src/kiss/FuzzyMap.hx | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 kiss/src/kiss/FuzzyMap.hx diff --git a/kiss/haxelib.json b/kiss/haxelib.json index 4cf49816..b73fefd8 100644 --- a/kiss/haxelib.json +++ b/kiss/haxelib.json @@ -13,6 +13,7 @@ "hscript": "", "uuid": "", "tink_macro": "", - "tink_json": "" + "tink_json": "", + "haxe-strings": "" } } \ No newline at end of file diff --git a/kiss/src/kiss/FuzzyMap.hx b/kiss/src/kiss/FuzzyMap.hx new file mode 100644 index 00000000..5555e678 --- /dev/null +++ b/kiss/src/kiss/FuzzyMap.hx @@ -0,0 +1,43 @@ +package kiss; + +import haxe.ds.StringMap; + +using hx.strings.Strings; + +abstract FuzzyMap(StringMap) from StringMap to StringMap { + public inline function new(m:StringMap) { + this = m; + } + + @:from + static public function fromMap(m:StringMap) { + return new FuzzyMap(m); + } + + @:to + public function toMap() { + return this; + } + + @:arrayAccess + public inline function get(searchKey:String):Null { + var bestMatch:Null = null; + var bestScore = 0; + + for (key => value in this) { + var score = searchKey.getFuzzyDistance(key); + if (score > bestScore) { + bestScore = score; + bestMatch = value; + } + } + + return bestMatch; + } + + @:arrayAccess + public inline function set(key:String, v:T):T { + this.set(key, v); + return v; + } +}