| 'use strict'; | 
|   | 
| var GetIntrinsic = require('get-intrinsic'); | 
|   | 
| var $SyntaxError = GetIntrinsic('%SyntaxError%'); | 
| var $TypeError = GetIntrinsic('%TypeError%'); | 
| var $Promise = GetIntrinsic('%Promise%', true); | 
|   | 
| var Call = require('./Call'); | 
| var CompletionRecord = require('./CompletionRecord'); | 
| var GetMethod = require('./GetMethod'); | 
| var Type = require('./Type'); | 
|   | 
| var assertRecord = require('../helpers/assertRecord'); | 
|   | 
| var callBound = require('call-bind/callBound'); | 
|   | 
| var $then = callBound('Promise.prototype.then', true); | 
|   | 
| // https://262.ecma-international.org/9.0/#sec-asynciteratorclose | 
|   | 
| module.exports = function AsyncIteratorClose(iteratorRecord, completion) { | 
|     assertRecord(Type, 'Iterator Record', 'iteratorRecord', iteratorRecord); // step 1 | 
|   | 
|     if (!(completion instanceof CompletionRecord)) { | 
|         throw new $TypeError('Assertion failed: completion is not a Completion Record instance'); // step 2 | 
|     } | 
|   | 
|     if (!$then) { | 
|         throw new $SyntaxError('This environment does not support Promises.'); | 
|     } | 
|   | 
|     var iterator = iteratorRecord['[[Iterator]]']; // step 3 | 
|   | 
|     return new $Promise(function (resolve) { | 
|         var ret = GetMethod(iterator, 'return'); // step 4 | 
|   | 
|         if (typeof ret === 'undefined') { | 
|             resolve(completion); // step 5 | 
|         } else { | 
|             resolve($then( | 
|                 new $Promise(function (resolve2) { | 
|                     // process.exit(42); | 
|                     resolve2(Call(ret, iterator, [])); // step 6 | 
|                 }), | 
|                 function (innerResult) { | 
|                     if (Type(innerResult) !== 'Object') { | 
|                         throw new $TypeError('`innerResult` must be an Object'); // step 10 | 
|                     } | 
|                     return completion; | 
|                 }, | 
|                 function (e) { | 
|                     if (completion.type() === 'throw') { | 
|                         completion['?'](); // step 8 | 
|                     } else { | 
|                         throw e; // step 9 | 
|                     } | 
|                 } | 
|             )); | 
|         } | 
|     }); | 
| }; |