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

158 lines (148 loc) 4.5 kB
'use strict'; var ctx = require('./_ctx'); var $export = require('./_export'); var createDesc = require('./_property-desc'); var assign = require('./_object-assign'); var create = require('./_object-create'); var getPrototypeOf = require('./_object-gpo'); var getKeys = require('./_object-keys'); var dP = require('./_object-dp'); var keyOf = require('./_keyof'); var aFunction = require('./_a-function'); var forOf = require('./_for-of'); var isIterable = require('./core.is-iterable'); var $iterCreate = require('./_iter-create'); var step = require('./_iter-step'); var isObject = require('./_is-object'); var toIObject = require('./_to-iobject'); var DESCRIPTORS = require('./_descriptors'); var has = require('./_has'); // 0 -> Dict.forEach // 1 -> Dict.map // 2 -> Dict.filter // 3 -> Dict.some // 4 -> Dict.every // 5 -> Dict.find // 6 -> Dict.findKey // 7 -> Dict.mapPairs var createDictMethod = function (TYPE) { var IS_MAP = TYPE == 1; var IS_EVERY = TYPE == 4; return function (object, callbackfn, that /* = undefined */) { var f = ctx(callbackfn, that, 3); var O = toIObject(object); var result = IS_MAP || TYPE == 7 || TYPE == 2 ? new (typeof this == 'function' ? this : Dict)() : undefined; var key, val, res; for (key in O) if (has(O, key)) { val = O[key]; res = f(val, key, object); if (TYPE) { if (IS_MAP) result[key] = res; // map else if (res) switch (TYPE) { case 2: result[key] = val; break; // filter case 3: return true; // some case 5: return val; // find case 6: return key; // findKey case 7: result[res[0]] = res[1]; // mapPairs } else if (IS_EVERY) return false; // every } } return TYPE == 3 || IS_EVERY ? IS_EVERY : result; }; }; var findKey = createDictMethod(6); var createDictIter = function (kind) { return function (it) { return new DictIterator(it, kind); }; }; var DictIterator = function (iterated, kind) { this._t = toIObject(iterated); // target this._a = getKeys(iterated); // keys this._i = 0; // next index this._k = kind; // kind }; $iterCreate(DictIterator, 'Dict', function () { var that = this; var O = that._t; var keys = that._a; var kind = that._k; var key; do { if (that._i >= keys.length) { that._t = undefined; return step(1); } } while (!has(O, key = keys[that._i++])); if (kind == 'keys') return step(0, key); if (kind == 'values') return step(0, O[key]); return step(0, [key, O[key]]); }); function Dict(iterable) { var dict = create(null); if (iterable != undefined) { if (isIterable(iterable)) { forOf(iterable, true, function (key, value) { dict[key] = value; }); } else assign(dict, iterable); } return dict; } Dict.prototype = null; function reduce(object, mapfn, init) { aFunction(mapfn); var O = toIObject(object); var keys = getKeys(O); var length = keys.length; var i = 0; var memo, key; if (arguments.length < 3) { if (!length) throw TypeError('Reduce of empty object with no initial value'); memo = O[keys[i++]]; } else memo = Object(init); while (length > i) if (has(O, key = keys[i++])) { memo = mapfn(memo, O[key], key, object); } return memo; } function includes(object, el) { // eslint-disable-next-line no-self-compare return (el == el ? keyOf(object, el) : findKey(object, function (it) { // eslint-disable-next-line no-self-compare return it != it; })) !== undefined; } function get(object, key) { if (has(object, key)) return object[key]; } function set(object, key, value) { if (DESCRIPTORS && key in Object) dP.f(object, key, createDesc(0, value)); else object[key] = value; return object; } function isDict(it) { return isObject(it) && getPrototypeOf(it) === Dict.prototype; } $export($export.G + $export.F, { Dict: Dict }); $export($export.S, 'Dict', { keys: createDictIter('keys'), values: createDictIter('values'), entries: createDictIter('entries'), forEach: createDictMethod(0), map: createDictMethod(1), filter: createDictMethod(2), some: createDictMethod(3), every: createDictMethod(4), find: createDictMethod(5), findKey: findKey, mapPairs: createDictMethod(7), reduce: reduce, keyOf: keyOf, includes: includes, has: has, get: get, set: set, isDict: isDict });