-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
95 lines (88 loc) · 2.49 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const minimalDesc = ["h", "min", "s", "ms", "μs", "ns"];
const verboseDesc = [
"hour",
"minute",
"second",
"millisecond",
"microsecond",
"nanosecond",
];
const convert = [60 * 60, 60, 1, 1e6, 1e3, 1] as const;
export const printHRTime: any = (source: any, opts: any) => {
let verbose,
precise,
i,
spot,
sourceAtStep,
valAtStep,
decimals,
strAtStep,
results,
totalSeconds;
verbose = false;
precise = false;
if (opts) {
verbose = opts.verbose || false;
precise = opts.precise || false;
}
if (!Array.isArray(source) || source.length !== 2) {
return "";
}
if (typeof source[0] !== "number" || typeof source[1] !== "number") {
return "";
}
// normalize source array due to changes in node v5.4+
if (source[1] < 0) {
totalSeconds = source[0] + source[1] / 1e9;
source[0] = Math.floor(totalSeconds);
source[1] = parseFloat((totalSeconds % 1).toPrecision(9)) * 1e9;
}
results = "";
// foreach unit
for (i = 0; i < 6; i++) {
spot = i < 3 ? 0 : 1; // grabbing first or second spot in source array
sourceAtStep = source[spot];
if (i !== 3 && i !== 0) {
sourceAtStep = sourceAtStep % (convert[i - 1] as number); // trim off previous portions
}
if (i === 2) {
sourceAtStep += source[1] / 1e9; // get partial seconds from other portion of the array
}
valAtStep = sourceAtStep / (convert[i] as number); // val at this unit
if (valAtStep >= 1) {
if (verbose) {
valAtStep = Math.floor(valAtStep); // deal in whole units, subsequent laps will get the decimal portion
}
if (!precise) {
// don't fling too many decimals
decimals = valAtStep >= 10 ? 0 : 2;
strAtStep = valAtStep.toFixed(decimals);
} else {
strAtStep = valAtStep.toString();
}
if (
strAtStep.indexOf(".") > -1 &&
strAtStep[strAtStep.length - 1] === "0"
) {
strAtStep = strAtStep.replace(/\.?0+$/, ""); // remove trailing zeros
}
if (results) {
results += " "; // append space if we have a previous value
}
results += strAtStep; // append the value
// append units
if (verbose) {
results += " " + verboseDesc[i];
if (strAtStep !== "1") {
results += "s";
}
} else {
results += " " + minimalDesc[i];
}
if (!verbose) {
break; // verbose gets as many groups as necessary, the rest get only one
}
}
}
return results;
};