Silence linter
[benchmarks-js.git] / benchmark-utils.js
1 const crypto = require('crypto')
2
3 /**
4 * Generate a cryptographically secure random number in the [0,1[ range
5 *
6 * @returns
7 */
8 function secureRandom () {
9 return crypto.randomBytes(4).readUInt32LE() / 0x100000000
10 }
11
12 /**
13 * @param max
14 * @param min
15 * @returns
16 */
17 function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) {
18 if (max < 0) {
19 throw new RangeError('Invalid interval')
20 }
21 max = Math.floor(max)
22 if (min != null && min !== 0) {
23 if (max < min || min < 0) {
24 throw new RangeError('Invalid interval')
25 }
26 min = Math.ceil(min)
27 return Math.floor(secureRandom() * (max - min + 1)) + min
28 }
29 return Math.floor(secureRandom() * (max + 1))
30 }
31
32 /**
33 *
34 * @param size
35 * @param max
36 * @param numberGenerator
37 * @returns
38 */
39 function generateRandomNumberArray (
40 size,
41 max = Number.MAX_VALUE,
42 numberGenerator = generateRandomFloat
43 ) {
44 const array = []
45 for (let i = 0; i < size; i++) {
46 array.push(numberGenerator(max))
47 }
48 return array
49 }
50
51 /**
52 *
53 * @param max
54 * @param min
55 * @param negative
56 * @returns
57 */
58 function generateRandomFloat (max = Number.MAX_VALUE, min = 0, negative = true) {
59 if (max < min || min < 0 || max < 0) {
60 throw new RangeError('Invalid interval')
61 }
62 const randomPositiveFloat = crypto.randomBytes(4).readUInt32LE() / 0xffffffff
63 const sign = negative && randomPositiveFloat < 0.5 ? -1 : 1
64 return sign * (randomPositiveFloat * (max - min) + min)
65 }
66
67 /**
68 * @param ms
69 * @returns
70 */
71 async function sleep (ms) {
72 return new Promise(resolve => setTimeout(resolve, ms))
73 }
74
75 const LIST_FORMATTER = new Intl.ListFormat('en-US', {
76 style: 'long',
77 type: 'conjunction'
78 })
79
80 module.exports = {
81 generateRandomInteger,
82 generateRandomFloat,
83 generateRandomNumberArray,
84 sleep,
85 secureRandom,
86 LIST_FORMATTER
87 }