diff --git a/std/js/_std/haxe/ds/StringMap.hx b/std/js/_std/haxe/ds/StringMap.hx index b768b0676fc..196d94e06a1 100644 --- a/std/js/_std/haxe/ds/StringMap.hx +++ b/std/js/_std/haxe/ds/StringMap.hx @@ -26,7 +26,77 @@ import js.lib.Object; import haxe.Constraints.IMap; import haxe.DynamicAccess; -#if (js_es >= 5) +#if (js_es >= 6) +import js.lib.HaxeIterator; + +// @:coreApi +class StringMap extends NativeMap implements IMap { + function keyIter():js.lib.Iterator return super._keys(); + function valIter():js.lib.Iterator return super._values(); + + public inline function exists(k:String):Bool { + return has(k); + } + + public inline function remove(k:String):Bool { + return delete(k); + } + + public inline function keys():Iterator { + return new HaxeIterator(keyIter()); + } + + public inline function iterator():Iterator { + return new HaxeIterator(valIter()); + } + + public inline function keyValueIterator():KVIterator { + return new KVIterator(entries()); + } + + public inline function copy():IMap { + return js.Syntax.construct(StringMap, this); + } + + public function toString():String { + return null; + } +} + +@:native("Map") +private extern class NativeMap { + function new(); + @:pure function get(key:String):Null; + @:pure private function has(key:K):Bool; + function set(key:K, value:V):Void; + private function delete(key:K):Bool; + function clear():Void; + @:native("keys") private function _keys():js.lib.Iterator; + @:native("values") private function _values():js.lib.Iterator; + @:pure private function entries():js.lib.Iterator>; +} + +private class KVIterator { + final jsIterator: js.lib.Iterator>; + var lastStep: js.lib.Iterator.IteratorStep>; + + public inline function new(jsIterator: js.lib.Iterator>) { + this.jsIterator = jsIterator; + lastStep = jsIterator.next(); + } + + public inline function hasNext(): Bool { + return !lastStep.done; + } + + public inline function next(): {key:K, value:V} { + var v = lastStep.value; + lastStep = jsIterator.next(); + return {key: v.key, value: v.value}; + } +} + +#elseif (js_es >= 5) @:coreApi class StringMap implements IMap { var h:Dynamic;