forked from microsoft/vscode-cpptools
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.ts
More file actions
56 lines (46 loc) · 3.08 KB
/
Copy patharray.ts
File metadata and controls
56 lines (46 loc) · 3.08 KB
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
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
/* eslint-disable @typescript-eslint/unified-signatures */
/* eslint-disable @typescript-eslint/no-unused-vars */
import { fail } from 'assert';
import { is } from '../System/guards';
export function first<TElement>(iterable: undefined): undefined;
export function first<TElement>(iterable: Iterable<TElement> | undefined): TElement | undefined;
export function first<TElement>(iterable: Iterable<TElement> | undefined, predicate: (element: TElement) => true | undefined): TElement | undefined;
export function first<TElement>(iterable: Promise<Iterable<TElement> | undefined>): Promise<TElement | undefined>;
export function first<TElement>(iterable: Promise<Iterable<TElement> | undefined>, predicate: (element: TElement) => true | undefined): Promise<TElement | undefined>;
export function first<TElement>(iterable: Iterable<TElement> | undefined | Promise<Iterable<TElement> | undefined>, predicate: (element: TElement) => true | undefined = (e) => e as any): TElement | Promise<TElement | undefined> | undefined {
if (iterable === undefined) {
return undefined;
}
if (is.promise(iterable)) {
return iterable.then(i => first(i, predicate));
}
for (const each of iterable) {
if (predicate(each)) {
return each;
}
}
return undefined;
}
export function firstOrFail<TElement>(iterable: undefined, message: string | Error): never;
export function firstOrFail<TElement>(iterable: Iterable<TElement>, message: string | Error): TElement | never;
export function firstOrFail<TElement>(iterable: Iterable<TElement>, predicate: (element: TElement) => true | undefined, message: string | Error): TElement | never;
export function firstOrFail<TElement>(iterable: Promise<Iterable<TElement>>, message: string | Error): Promise<TElement> | never;
export function firstOrFail<TElement>(iterable: Promise<Iterable<TElement>>, predicate: (element: TElement) => true | undefined, message: string | Error): Promise<TElement> | never;
export function firstOrFail<TElement>(iterable: Iterable<TElement> | undefined | Promise<Iterable<TElement> | undefined>, predicateOrMessage: string | Error | ((element: TElement) => true | undefined) = (e) => e as any, message?: string | Error): TElement | Promise<TElement> | never {
let result: any;
if (message === undefined) {
message = predicateOrMessage as string | Error;
predicateOrMessage = (e) => e as any;
result = first(iterable as Iterable<TElement>, predicateOrMessage);
} else {
result = first(iterable as any, predicateOrMessage as any);
}
if (is.promise(result)) {
return result.then(r => r !== undefined ? r : fail(message));
}
return result !== undefined ? result as TElement : fail(message);
}