1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | type Defer<T> = {
|
20 | promise: Promise<T>,
|
21 | resolve: (T) => void,
|
22 | reject: (any) => void,
|
23 | };
|
24 |
|
25 | export function defer<T>(): Defer<T> {
|
26 | let resolve, reject;
|
27 | let promise = new Promise(function (success, failure) {
|
28 | resolve = success;
|
29 | reject = failure;
|
30 | });
|
31 | if (!resolve || !reject) throw "defer() error";
|
32 | return { promise, resolve, reject };
|
33 | }
|
34 |
|
35 |
|
36 | export function splitPath(path: string): number[] {
|
37 | let result = [];
|
38 | let components = path.split("/");
|
39 | components.forEach((element) => {
|
40 | let number = parseInt(element, 10);
|
41 | if (isNaN(number)) {
|
42 | return;
|
43 | }
|
44 | if (element.length > 1 && element[element.length - 1] === "'") {
|
45 | number += 0x80000000;
|
46 | }
|
47 | result.push(number);
|
48 | });
|
49 | return result;
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 | export function eachSeries<A>(arr: A[], fun: (A) => Promise<*>): Promise<*> {
|
55 | return arr.reduce((p, e) => p.then(() => fun(e)), Promise.resolve());
|
56 | }
|
57 |
|
58 | export function foreach<T, A>(
|
59 | arr: T[],
|
60 | callback: (T, number) => Promise<A>
|
61 | ): Promise<A[]> {
|
62 | function iterate(index, array, result) {
|
63 | if (index >= array.length) {
|
64 | return result;
|
65 | } else
|
66 | return callback(array[index], index).then(function (res) {
|
67 | result.push(res);
|
68 | return iterate(index + 1, array, result);
|
69 | });
|
70 | }
|
71 | return Promise.resolve().then(() => iterate(0, arr, []));
|
72 | }
|
73 |
|
74 | export function doIf(
|
75 | condition: boolean,
|
76 | callback: () => any | Promise<any>
|
77 | ): Promise<void> {
|
78 | return Promise.resolve().then(() => {
|
79 | if (condition) {
|
80 | return callback();
|
81 | }
|
82 | });
|
83 | }
|
84 |
|
85 | export function asyncWhile<T>(
|
86 | predicate: () => boolean,
|
87 | callback: () => Promise<T>
|
88 | ): Promise<Array<T>> {
|
89 | function iterate(result) {
|
90 | if (!predicate()) {
|
91 | return result;
|
92 | } else {
|
93 | return callback().then((res) => {
|
94 | result.push(res);
|
95 | return iterate(result);
|
96 | });
|
97 | }
|
98 | }
|
99 | return Promise.resolve([]).then(iterate);
|
100 | }
|