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
|
function getZonedDateTime(instant?: Temporal.Instant | Date) {
if (instant == null) {
instant = Temporal.Now.instant();
} else if (instant instanceof Date) {
instant = instant.toTemporalInstant();
}
return instant.toZonedDateTimeISO("UTC");
}
export function generateTimeStringForFileName(
instant?: Temporal.Instant | Date,
dateOnly: boolean = false,
): string {
const time = getZonedDateTime(instant);
if (dateOnly) {
return time.toPlainDate().toString();
} else {
return time.toPlainDateTime().toString().replaceAll(/:|\./g, "-");
}
}
export function transformProperties<T extends object, N>(
object: T,
transformer: (value: T[keyof T], key: keyof T) => N,
): { [k in keyof T]: N } {
return Object.fromEntries(
Object.entries(object).map((
[k, v],
) => [k, transformer(v, k as keyof T)]),
) as { [k in keyof T]: N };
}
export function createSingleton<T>(
name: string,
): [() => T, (v: T | null) => void] {
let singleton: T | null = null;
return [
() => {
if (singleton == null) {
throw new Error(`Singleton ${name} is not set now.`);
}
return singleton;
},
(newValue: T | null) => singleton = newValue,
];
}
|