You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.0 KiB
32 lines
1.0 KiB
'use strict'; |
|
var global = require('../internals/global'); |
|
var call = require('../internals/function-call'); |
|
var aCallable = require('../internals/a-callable'); |
|
var isCallable = require('../internals/is-callable'); |
|
var anObject = require('../internals/an-object'); |
|
|
|
var TypeError = global.TypeError; |
|
|
|
// `Map.prototype.upsert` method |
|
// https://github.com/thumbsupep/proposal-upsert |
|
module.exports = function upsert(key, updateFn /* , insertFn */) { |
|
var map = anObject(this); |
|
var get = aCallable(map.get); |
|
var has = aCallable(map.has); |
|
var set = aCallable(map.set); |
|
var insertFn = arguments.length > 2 ? arguments[2] : undefined; |
|
var value; |
|
if (!isCallable(updateFn) && !isCallable(insertFn)) { |
|
throw TypeError('At least one callback required'); |
|
} |
|
if (call(has, map, key)) { |
|
value = call(get, map, key); |
|
if (isCallable(updateFn)) { |
|
value = updateFn(value); |
|
call(set, map, key, value); |
|
} |
|
} else if (isCallable(insertFn)) { |
|
value = insertFn(); |
|
call(set, map, key, value); |
|
} return value; |
|
};
|
|
|