listorange
Version:
List array to Range
101 lines (86 loc) • 1.86 kB
JavaScript
/**
* list to range
* version 0.1.2
* non-blocking, efficient
*
* Copyright (c) 2016 Firanolfind
* MIT License
*
* 2016-10-19
*/
;
/*..................................*/
const qqsort = require('qqsort');
const setImmediate = global.setImmediate || process.nextTick;
module.exports = function(arr, get_string=true, sort=false, step=10000){
var result_arr = [];
var result_str = "";
var start = null;
var i = 0;
const length = arr.length;
var iterate = ()=> new Promise((resolve, reject)=>{
let k = 0;
setImmediate(()=>{
while(i < arr.length && !i < 0 || arr[i]+1 === arr[i+1] || arr[i] === arr[i+1]){
i++;
if(k >= step){
return resolve();
}
k++;
}
reject();
});
});
var find_range = ()=> new Promise((resolve, reject)=>{
setImmediate(()=>{
if(i >= length){
reject();
}else{
if(i && get_string)
result_str += ',';
start = arr[i];
let j = i;
var iterate_range = ()=> iterate()
.then(iterate_range)
.catch(()=>{
let o = [start];
if(get_string)
result_str += '' + start;
if(i > j){
if(get_string && start !== arr[i])
result_str += (arr[i] - start > 1 ? '-' : ',') + arr[i];
else if(start !== arr[i])
o.push(arr[i]);
}
if(!get_string)
result_arr.push(o);
i++;
resolve();
});
iterate_range();
}
});
});
return new Promise(function(resolve, reject){
setImmediate(()=>{
var start = err => {
if(err){
reject(err);
}else{
try{
var iterate_range = ()=> find_range()
.then(iterate_range)
.catch(()=> resolve( get_string ? result_str : result_arr ));
iterate_range();
}catch(e){
reject(e);
}
}
}
if(sort)
qqsort(arr, start);
else
start();
});
});
}