| 1 | module builtin |
| 2 | |
| 3 | struct map { |
| 4 | m JS.Map |
| 5 | pub: |
| 6 | len int |
| 7 | } |
| 8 | |
| 9 | fn (mut m map) internal_set(key JS.Any, val JS.Any) { |
| 10 | //$if es5 { |
| 11 | #let skey = key; |
| 12 | #if (key != null && typeof key.$toJS === 'function') key = key.$toJS(); |
| 13 | #if (!(key in m.val.map)) { |
| 14 | #m.val.length++; |
| 15 | #m.val.map[key] = { key: skey, val: val }; |
| 16 | #} else { |
| 17 | #m.val.map[key].val = val |
| 18 | #} |
| 19 | /*} $else { |
| 20 | # if (key.hasOwnProperty('$toJS')) key = key.$toJS(); |
| 21 | # m.val.m.set(key,val); |
| 22 | }*/ |
| 23 | _ := key |
| 24 | _ := val |
| 25 | } |
| 26 | |
| 27 | fn (mut m map) internal_get(key JS.Any) JS.Any { |
| 28 | mut val := JS.Any(unsafe { nil }) |
| 29 | //$if es5 { |
| 30 | #if (typeof key != "string" && key != null && typeof key.$toJS === 'function') key = key.$toJS(); |
| 31 | #if (key in m.val.map) { |
| 32 | #val = m.val.map[key].val |
| 33 | #} else { |
| 34 | #val = js_undefined() |
| 35 | #} |
| 36 | /*} $else { |
| 37 | # if (key.hasOwnProperty('$toJS')) key = key.$toJS(); |
| 38 | # val = m.val.m.get(key) |
| 39 | }*/ |
| 40 | _ := key |
| 41 | return val |
| 42 | } |
| 43 | |
| 44 | #map.prototype.get = function (key) { return map_internal_get(this,key); } |
| 45 | #map.prototype.set = function(key,val) { map_internal_set(this,key,val); } |
| 46 | #map.prototype.has = function (key) { if (typeof key != "string" && key != null && typeof key.$toJS === 'function') { key = key.$toJS() } return key in this.map; } |
| 47 | // Removes the mapping of a particular key from the map. |
| 48 | @[unsafe] |
| 49 | pub fn (mut m map) delete(key JS.Any) { |
| 50 | #let k = key != null && typeof key.$toJS === 'function' ? key.$toJS() : key; |
| 51 | |
| 52 | #if (k in m.val.map) { |
| 53 | #delete m.val.map[k]; |
| 54 | #m.val.length--; |
| 55 | #} |
| 56 | |
| 57 | _ := key |
| 58 | } |
| 59 | |
| 60 | pub fn (m map) clone() map { |
| 61 | mut res := m |
| 62 | #res = v_clone_value(m) |
| 63 | |
| 64 | return res |
| 65 | } |
| 66 | |
| 67 | pub fn (m &map) free() {} |
| 68 | |
| 69 | pub fn (m map) keys() array { |
| 70 | ret := JS.makeEmptyArray() |
| 71 | #for (var key in m.map) array_push(ret,m.map[key].key,false) |
| 72 | |
| 73 | return ret |
| 74 | } |
| 75 | |
| 76 | pub fn (m map) values() array { |
| 77 | ret := JS.makeEmptyArray() |
| 78 | #for (var key in m.map) array_push(ret,m.map[key].val,false); |
| 79 | |
| 80 | return ret |
| 81 | } |
| 82 | |
| 83 | //#Object.defineProperty(map.prototype,"len",{get: function() { return this.map.size; }}) |
| 84 | #map.prototype.toString = function () { |
| 85 | #function fmtKey(key) { return typeof key == 'string' ? '\'' + key + '\'' : key} |
| 86 | #let res = '{' |
| 87 | #for (const entry of this) { |
| 88 | #res += fmtKey(entry[0]) + ': ' + entry[0]; |
| 89 | #} |
| 90 | #res += '}' |
| 91 | #return res; |
| 92 | #} |
| 93 | |
| 94 | #map.prototype.getOrSet = function (key, init) { const skey = key; if (typeof key != "string" && key != null && typeof key.$toJS === 'function') { key = key.$toJS() } if (key in this.map) { return this.map[key].val; } this.length++; this.map[key] = { key: skey, val: init }; return this.map[key].val; } |
| 95 | |