-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
61 lines (52 loc) · 1.7 KB
/
index.js
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
const createLcg = (seed, modulus, multiplier, increment) => {
let z = seed;
return () => {
z = (multiplier * z + increment) % modulus;
return z / modulus;
};
};
const getSeedsFromDate = (date) => {
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, "0");
const day = date.getDate().toString().padStart(2, "0");
const hour = date.getHours().toString().padStart(2, "0");
return {
minute: parseInt(`${year}${month}${day}${hour}`),
hour: parseInt(`${year}${month}${day}`),
};
};
const getSequenceFromLcg = (lcg, length) => {
// generate number sequence
// [0.4, 0.2, 0.3]
const sequence = Array.from({ length }, lcg);
// copy and sort sequence
// [0.2, 0.3, 0.4]
const sorted = [...sequence].sort();
// map sequence elements to their sorting index
// [2, 0, 1]
return sequence.map((value) => sorted.indexOf(value));
};
export const fromDate = (date) => {
// extract seeds
const seed = getSeedsFromDate(date);
// create hours LCG using values from MINSTD
const minuteLcg = createLcg(seed.minute, 2147483647, 48271, 0);
// create hours LCG using values from the Numerical Recipes book
const hourLcg = createLcg(seed.hour, 4294967296, 1664525, 1013904223);
// generate sequences
const minuteSequence = getSequenceFromLcg(minuteLcg, 60);
const hourSequence = getSequenceFromLcg(hourLcg, 24);
const time = {
hour: hourSequence[date.getHours()],
minute: minuteSequence[date.getMinutes()],
second: date.getSeconds(),
};
return {
...time,
toDate: () => {
const flowdate = new Date(date.getTime());
flowdate.setHours(time.hour, time.minute, time.second);
return flowdate;
},
};
};