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

81 lines (73 loc) 2.46 kB
'use strict'; // https://github.com/tc39/proposal-iterator-helpers var aFunction = require('../internals/a-function'); var anObject = require('../internals/an-object'); var getBuiltIn = require('../internals/get-built-in'); var Promise = getBuiltIn('Promise'); var push = [].push; var createMethod = function (TYPE) { var IS_TO_ARRAY = TYPE == 0; var IS_FOR_EACH = TYPE == 1; var IS_EVERY = TYPE == 2; var IS_SOME = TYPE == 3; return function (iterator, fn) { anObject(iterator); var next = aFunction(iterator.next); var array = IS_TO_ARRAY ? [] : undefined; if (!IS_TO_ARRAY) aFunction(fn); return new Promise(function (resolve, reject) { var closeIteration = function (method, argument) { try { var returnMethod = iterator['return']; if (returnMethod !== undefined) { return Promise.resolve(returnMethod.call(iterator)).then(function () { method(argument); }, function (error) { reject(error); }); } } catch (error2) { return reject(error2); } method(argument); }; var onError = function (error) { closeIteration(reject, error); }; var loop = function () { try { Promise.resolve(anObject(next.call(iterator))).then(function (step) { try { if (anObject(step).done) { resolve(IS_TO_ARRAY ? array : IS_SOME ? false : IS_EVERY || undefined); } else { var value = step.value; if (IS_TO_ARRAY) { push.call(array, value); loop(); } else { Promise.resolve(fn(value)).then(function (result) { if (IS_FOR_EACH) { loop(); } else if (IS_EVERY) { result ? loop() : closeIteration(resolve, false); } else { result ? closeIteration(resolve, IS_SOME || value) : loop(); } }, onError); } } } catch (error) { onError(error); } }, onError); } catch (error2) { onError(error2); } }; loop(); }); }; }; module.exports = { toArray: createMethod(0), forEach: createMethod(1), every: createMethod(2), some: createMethod(3), find: createMethod(4) };