UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

51 lines (38 loc) 1.48 kB
'use strict'; var GetIntrinsic = require('../GetIntrinsic'); var $TypeError = GetIntrinsic('%TypeError%'); var Call = require('./Call'); var GetMethod = require('./GetMethod'); var IsCallable = require('./IsCallable'); var Type = require('./Type'); // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose module.exports = function IteratorClose(iterator, completion) { if (Type(iterator) !== 'Object') { throw new $TypeError('Assertion failed: Type(iterator) is not Object'); } if (!IsCallable(completion)) { throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record'); } var completionThunk = completion; var iteratorReturn = GetMethod(iterator, 'return'); if (typeof iteratorReturn === 'undefined') { return completionThunk(); } var completionRecord; try { var innerResult = Call(iteratorReturn, iterator, []); } catch (e) { // if we hit here, then "e" is the innerResult completion that needs re-throwing // if the completion is of type "throw", this will throw. completionThunk(); completionThunk = null; // ensure it's not called twice. // if not, then return the innerResult completion throw e; } completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does completionThunk = null; // ensure it's not called twice. if (Type(innerResult) !== 'Object') { throw new $TypeError('iterator .return must return an object'); } return completionRecord; };