'use strict'
function tqdm(){
function _render(n, total, elapsed) {
var cent = n/total*100;
var est = (100 - (cent+0.000001))/(cent+0.0000001) * elapsed;
var ips = n / ((elapsed+0.000001)/1000);
cent = Math.floor(cent);
var out = "|";
for(let i = 0; i < 10; i++) {
if(i >= Math.round(cent/10)) {
out += "-";
} else {
out += "#";
}
}
out += "| " + n + "/" + total + " " + cent + "% [";
out += "elapsed: " + _formatter(elapsed) + " ";
out += "left: " + _formatter(est) + ", ";
out += ips.toFixed(2) + " iters/s]\n";
return out;
}
function _formatter(msec) {
var out = "";
var sec = Math.floor(msec / 1000);
var min = Math.floor(sec / 60);
var hour = Math.floor(min / 60);
sec = sec - min * 60;
min = min - hour * 60;
if(hour > 0) {
if(hour < 10) {
out = "0"
}
out = out + hour.toString() + ":";
}
if(min < 10) {
out = out + "0";
}
out = out + min.toString() +":";
if(sec < 10) {
out = out + "0";
}
out = out + sec.toString();
return out;
}
return function* (iter, par) {
var def = {
desc:'',
minIter: 1,
minInterval: 500,
logging: false
};
var params = {}
if(typeof def === 'object') {
for(let i in def) {
params[i] = def[i];
}
}
if(typeof par === 'object') {
for(let i in par) {
params[i] = par[i];
}
}
var start = Date.now();
var now = start;
var n = 0;
var lastn = 0;
var elapsed;
var lastElapsed = 0;;
if(!("total" in params)) {
for (let i of iter) {
n++;
}
params["total"] = n;
n = 0;
}
console.log(params.desc);
process.stdout.write(_render(0,params.total,0));
for (let i of iter) {
yield i;
n++;
elapsed = Date.now() - start;
if(n - lastn >= params.minIter && elapsed - lastElapsed >= params.minInterval) {
if(params.logging) {
process.stdout.write("\u001b[1F\u001b[2K");
}
lastn = n;
lastElapsed = elapsed;
process.stdout.write(_render(n, params.total, elapsed));
}
if(n > params.total) {
break;
}
}
}
}
module.exports = tqdm();