12345678910111213141516171819202122232425262728293031 |
- 'use strict';
- 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 = TypeError;
-
- // `Map.prototype.upsert` method
- // https://github.com/tc39/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 new $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;
- };
|