| 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;
 
- };
 
 
  |