-
-
Notifications
You must be signed in to change notification settings - Fork 49
/
global.ts
62 lines (55 loc) · 1.42 KB
/
global.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
//================================================================
/**
* @packageDocumentation
* @module std
*/
//================================================================
import { ILockable } from "../base/thread/ILockable";
/**
* Sleep for time span.
*
* @param ms The milliseconds to sleep.
*/
export function sleep_for(ms: number): Promise<void>
{
return new Promise<void>(resolve =>
{
setTimeout(resolve, ms);
});
}
/**
* Sleep until time expiration.
*
* @param at The time point to wake up.
*/
export function sleep_until(at: Date): Promise<void>
{
const now: Date = new Date();
const ms: number = at.getTime() - now.getTime(); // MILLISECONDS TO WAIT
return sleep_for(ms); // CONVERT TO THE SLEEP_FOR
}
/**
* Lock multiple mutexes.
*
* @param items Items to lock.
*/
export async function lock(...items: Pick<ILockable, "lock">[]): Promise<void>
{
const promises: Promise<void>[] = [];
for (const mtx of items)
promises.push(mtx.lock());
await Promise.all(promises);
}
/**
* Try lock mutexes.
*
* @param items Items to try lock.
* @return Index of mutex who failed to lock. None of them're failed, then returns `-1`.
*/
export async function try_lock(...items: Pick<ILockable, "try_lock">[]): Promise<number>
{
for (let i: number = 0; i < items.length; ++i)
if (await items[i].try_lock() === false)
return i;
return -1;
}