v2 / vlib / builtin / js / map.js.v
94 lines · 79 sloc · 2.43 KB · 99f141f741b643327a2628963d95998c862c7ed2
Raw
1module builtin
2
3struct map {
4 m JS.Map
5pub:
6 len int
7}
8
9fn (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
27fn (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]
49pub 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
60pub fn (m map) clone() map {
61 mut res := m
62 #res = v_clone_value(m)
63
64 return res
65}
66
67pub fn (m &map) free() {}
68
69pub 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
76pub 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