/script-kiddie/002_script_kiddie/script-kiddie/node_modules/pseudomap/pseudomap.js |
@@ -0,0 +1,113 @@ |
var hasOwnProperty = Object.prototype.hasOwnProperty |
|
module.exports = PseudoMap |
|
function PseudoMap (set) { |
if (!(this instanceof PseudoMap)) // whyyyyyyy |
throw new TypeError("Constructor PseudoMap requires 'new'") |
|
this.clear() |
|
if (set) { |
if ((set instanceof PseudoMap) || |
(typeof Map === 'function' && set instanceof Map)) |
set.forEach(function (value, key) { |
this.set(key, value) |
}, this) |
else if (Array.isArray(set)) |
set.forEach(function (kv) { |
this.set(kv[0], kv[1]) |
}, this) |
else |
throw new TypeError('invalid argument') |
} |
} |
|
PseudoMap.prototype.forEach = function (fn, thisp) { |
thisp = thisp || this |
Object.keys(this._data).forEach(function (k) { |
if (k !== 'size') |
fn.call(thisp, this._data[k].value, this._data[k].key) |
}, this) |
} |
|
PseudoMap.prototype.has = function (k) { |
return !!find(this._data, k) |
} |
|
PseudoMap.prototype.get = function (k) { |
var res = find(this._data, k) |
return res && res.value |
} |
|
PseudoMap.prototype.set = function (k, v) { |
set(this._data, k, v) |
} |
|
PseudoMap.prototype.delete = function (k) { |
var res = find(this._data, k) |
if (res) { |
delete this._data[res._index] |
this._data.size-- |
} |
} |
|
PseudoMap.prototype.clear = function () { |
var data = Object.create(null) |
data.size = 0 |
|
Object.defineProperty(this, '_data', { |
value: data, |
enumerable: false, |
configurable: true, |
writable: false |
}) |
} |
|
Object.defineProperty(PseudoMap.prototype, 'size', { |
get: function () { |
return this._data.size |
}, |
set: function (n) {}, |
enumerable: true, |
configurable: true |
}) |
|
PseudoMap.prototype.values = |
PseudoMap.prototype.keys = |
PseudoMap.prototype.entries = function () { |
throw new Error('iterators are not implemented in this version') |
} |
|
// Either identical, or both NaN |
function same (a, b) { |
return a === b || a !== a && b !== b |
} |
|
function Entry (k, v, i) { |
this.key = k |
this.value = v |
this._index = i |
} |
|
function find (data, k) { |
for (var i = 0, s = '_' + k, key = s; |
hasOwnProperty.call(data, key); |
key = s + i++) { |
if (same(data[key].key, k)) |
return data[key] |
} |
} |
|
function set (data, k, v) { |
for (var i = 0, s = '_' + k, key = s; |
hasOwnProperty.call(data, key); |
key = s + i++) { |
if (same(data[key].key, k)) { |
data[key].value = v |
return |
} |
} |
data.size++ |
data[key] = new Entry(k, v, key) |
} |