| '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/12.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 $then( | 
|         $then( | 
|             $then( | 
|                 new $Promise(function (resolve) { | 
|                     resolve(GetMethod(iterator, 'return')); // step 4 | 
|                     // resolve(Call(ret, iterator, [])); // step 6 | 
|                 }), | 
|                 function (returnV) { // step 5.a | 
|                     if (typeof returnV === 'undefined') { | 
|                         return completion; // step 5.b | 
|                     } | 
|                     return Call(returnV, iterator); // step 5.c, 5.d. | 
|                 } | 
|             ), | 
|             null, | 
|             function (e) { | 
|                 if (completion.type() === 'throw') { | 
|                     completion['?'](); // step 6 | 
|                 } else { | 
|                     throw e; // step 7 | 
|                 } | 
|             } | 
|         ), | 
|         function (innerResult) { // step 8 | 
|             if (completion.type() === 'throw') { | 
|                 completion['?'](); // step 6 | 
|             } | 
|             if (Type(innerResult) !== 'Object') { | 
|                 throw new $TypeError('`innerResult` must be an Object'); // step 10 | 
|             } | 
|             return completion; | 
|         } | 
|     ); | 
| }; |