UNPKG

aureooms-js-array

Version:

array manipulation code bricks for JavaScript

67 lines (45 loc) 4.59 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.permutations = permutations; var _ = require('..'); function permutations(iterable, repeat, out) { // permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC // permutations(range(3), 3) --> 012 021 102 120 201 210 var pool, i, j, w, len, indices, cycles, x, tmp; pool = iterable; len = pool.length; if (repeat > len) { return out; } indices = (0, _.range)(0, len, 1, []); cycles = (0, _.range)(len, len - repeat, -1, []); out.push((0, _.pick)(pool, indices.slice(0, repeat), [])); if (repeat === 0 || len === 0) { return out; } for (;;) { i = repeat; while (i--) { --cycles[i]; if (cycles[i] === 0) { x = indices[i]; indices.splice(i, 1); indices.push(x); cycles[i] = len - i; } else { j = cycles[i]; tmp = indices[i]; indices[i] = indices[len - j]; indices[len - j] = tmp; out.push((0, _.pick)(pool, indices.slice(0, repeat), [])); break; } } if (i === -1) { return out; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAvcGVybXV0YXRpb25zLmpzIl0sIm5hbWVzIjpbInBlcm11dGF0aW9ucyIsIml0ZXJhYmxlIiwicmVwZWF0Iiwib3V0IiwicG9vbCIsImkiLCJqIiwidyIsImxlbiIsImluZGljZXMiLCJjeWNsZXMiLCJ4IiwidG1wIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7OztRQUVnQkEsWSxHQUFBQSxZOztBQUZoQjs7QUFFTyxTQUFTQSxZQUFULENBQXVCQyxRQUF2QixFQUFpQ0MsTUFBakMsRUFBeUNDLEdBQXpDLEVBQStDOztBQUVyRDtBQUNBOztBQUVBLEtBQUlDLElBQUosRUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkMsR0FBbkIsRUFBd0JDLE9BQXhCLEVBQWlDQyxNQUFqQyxFQUF5Q0MsQ0FBekMsRUFBNENDLEdBQTVDOztBQUVBUixRQUFPSCxRQUFQO0FBQ0FPLE9BQU1KLEtBQUtTLE1BQVg7O0FBR0EsS0FBS1gsU0FBU00sR0FBZCxFQUFvQjtBQUNuQixTQUFPTCxHQUFQO0FBQ0E7O0FBR0RNLFdBQVUsYUFBTyxDQUFQLEVBQVVELEdBQVYsRUFBZSxDQUFmLEVBQWtCLEVBQWxCLENBQVY7QUFDQUUsVUFBUyxhQUFPRixHQUFQLEVBQVlBLE1BQU1OLE1BQWxCLEVBQTBCLENBQUMsQ0FBM0IsRUFBOEIsRUFBOUIsQ0FBVDs7QUFFQUMsS0FBSVcsSUFBSixDQUFVLFlBQU1WLElBQU4sRUFBWUssUUFBUU0sS0FBUixDQUFlLENBQWYsRUFBa0JiLE1BQWxCLENBQVosRUFBd0MsRUFBeEMsQ0FBVjs7QUFFQSxLQUFLQSxXQUFXLENBQVgsSUFBZ0JNLFFBQVEsQ0FBN0IsRUFBaUM7QUFDaEMsU0FBT0wsR0FBUDtBQUNBOztBQUVELFVBQVk7O0FBRVhFLE1BQUlILE1BQUo7O0FBRUEsU0FBUUcsR0FBUixFQUFjOztBQUViLEtBQUVLLE9BQU9MLENBQVAsQ0FBRjs7QUFFQSxPQUFLSyxPQUFPTCxDQUFQLE1BQWMsQ0FBbkIsRUFBdUI7O0FBRXRCTSxRQUFJRixRQUFRSixDQUFSLENBQUo7O0FBRUFJLFlBQVFPLE1BQVIsQ0FBZVgsQ0FBZixFQUFrQixDQUFsQjtBQUNBSSxZQUFRSyxJQUFSLENBQWFILENBQWI7O0FBRUFELFdBQU9MLENBQVAsSUFBWUcsTUFBTUgsQ0FBbEI7QUFDQSxJQVJELE1BVUs7O0FBRUpDLFFBQUlJLE9BQU9MLENBQVAsQ0FBSjs7QUFFQU8sVUFBTUgsUUFBUUosQ0FBUixDQUFOO0FBQ0FJLFlBQVFKLENBQVIsSUFBYUksUUFBUUQsTUFBTUYsQ0FBZCxDQUFiO0FBQ0FHLFlBQVFELE1BQU1GLENBQWQsSUFBbUJNLEdBQW5COztBQUVBVCxRQUFJVyxJQUFKLENBQVUsWUFBTVYsSUFBTixFQUFZSyxRQUFRTSxLQUFSLENBQWUsQ0FBZixFQUFrQmIsTUFBbEIsQ0FBWixFQUF3QyxFQUF4QyxDQUFWO0FBQ0E7QUFDQTtBQUVEOztBQUVELE1BQUtHLE1BQU0sQ0FBQyxDQUFaLEVBQWdCO0FBQ2YsVUFBT0YsR0FBUDtBQUNBO0FBRUQ7QUFFRCIsImZpbGUiOiJwZXJtdXRhdGlvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5nZSAsIHBpY2sgfSBmcm9tICcuLicgO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVybXV0YXRpb25zKCBpdGVyYWJsZSwgcmVwZWF0LCBvdXQgKSB7XG5cblx0Ly8gcGVybXV0YXRpb25zKCdBQkNEJywgMikgLS0+IEFCIEFDIEFEIEJBIEJDIEJEIENBIENCIENEIERBIERCIERDXG5cdC8vIHBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMykgLS0+IDAxMiAwMjEgMTAyIDEyMCAyMDEgMjEwXG5cblx0dmFyIHBvb2wsIGksIGosIHcsIGxlbiwgaW5kaWNlcywgY3ljbGVzLCB4LCB0bXA7XG5cblx0cG9vbCA9IGl0ZXJhYmxlO1xuXHRsZW4gPSBwb29sLmxlbmd0aDtcblxuXG5cdGlmICggcmVwZWF0ID4gbGVuICkge1xuXHRcdHJldHVybiBvdXQ7XG5cdH1cblxuXG5cdGluZGljZXMgPSByYW5nZSggMCwgbGVuLCAxLCBbXSApO1xuXHRjeWNsZXMgPSByYW5nZSggbGVuLCBsZW4gLSByZXBlYXQsIC0xLCBbXSApO1xuXG5cdG91dC5wdXNoKCBwaWNrKCBwb29sLCBpbmRpY2VzLnNsaWNlKCAwLCByZXBlYXQgKSwgW10gKSApO1xuXG5cdGlmICggcmVwZWF0ID09PSAwIHx8IGxlbiA9PT0gMCApIHtcblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0Zm9yICggOyA7ICkge1xuXG5cdFx0aSA9IHJlcGVhdDtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHQtLWN5Y2xlc1tpXTtcblxuXHRcdFx0aWYgKCBjeWNsZXNbaV0gPT09IDAgKSB7XG5cblx0XHRcdFx0eCA9IGluZGljZXNbaV07XG5cblx0XHRcdFx0aW5kaWNlcy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGluZGljZXMucHVzaCh4KTtcblxuXHRcdFx0XHRjeWNsZXNbaV0gPSBsZW4gLSBpO1xuXHRcdFx0fVxuXG5cdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRqID0gY3ljbGVzW2ldO1xuXG5cdFx0XHRcdHRtcCA9IGluZGljZXNbaV07XG5cdFx0XHRcdGluZGljZXNbaV0gPSBpbmRpY2VzW2xlbiAtIGpdO1xuXHRcdFx0XHRpbmRpY2VzW2xlbiAtIGpdID0gdG1wO1xuXG5cdFx0XHRcdG91dC5wdXNoKCBwaWNrKCBwb29sLCBpbmRpY2VzLnNsaWNlKCAwLCByZXBlYXQgKSwgW10gKSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaSA9PT0gLTEgKSB7XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH1cblxuXHR9XG5cbn1cbiJdfQ==