@xterm/xterm 5.6.0-beta.6 → 5.6.0-beta.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +7 -3
  2. package/css/xterm.css +71 -4
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +53 -0
  6. package/lib/xterm.mjs.map +7 -0
  7. package/package.json +43 -33
  8. package/src/browser/AccessibilityManager.ts +53 -25
  9. package/src/browser/{Terminal.ts → CoreBrowserTerminal.ts} +132 -144
  10. package/src/browser/Linkifier.ts +15 -13
  11. package/src/browser/LocalizableStrings.ts +15 -4
  12. package/src/browser/{Types.d.ts → Types.ts} +67 -15
  13. package/src/browser/Viewport.ts +142 -370
  14. package/src/browser/decorations/BufferDecorationRenderer.ts +14 -9
  15. package/src/browser/decorations/OverviewRulerRenderer.ts +40 -44
  16. package/src/browser/public/Terminal.ts +25 -19
  17. package/src/browser/renderer/dom/DomRenderer.ts +14 -16
  18. package/src/browser/renderer/shared/CharAtlasUtils.ts +4 -0
  19. package/src/browser/renderer/shared/CustomGlyphs.ts +6 -0
  20. package/src/browser/renderer/shared/DevicePixelObserver.ts +1 -2
  21. package/src/browser/renderer/shared/TextureAtlas.ts +3 -3
  22. package/src/browser/renderer/shared/{Types.d.ts → Types.ts} +4 -4
  23. package/src/browser/services/CharSizeService.ts +6 -6
  24. package/src/browser/services/CoreBrowserService.ts +15 -15
  25. package/src/browser/services/LinkProviderService.ts +2 -2
  26. package/src/browser/services/RenderService.ts +20 -20
  27. package/src/browser/services/SelectionService.ts +8 -8
  28. package/src/browser/services/Services.ts +13 -13
  29. package/src/browser/services/ThemeService.ts +17 -56
  30. package/src/browser/shared/Constants.ts +8 -0
  31. package/src/common/CircularList.ts +5 -5
  32. package/src/common/CoreTerminal.ts +35 -41
  33. package/src/common/InputHandler.ts +34 -28
  34. package/src/common/{Types.d.ts → Types.ts} +11 -17
  35. package/src/common/buffer/Buffer.ts +5 -1
  36. package/src/common/buffer/BufferSet.ts +5 -5
  37. package/src/common/buffer/Marker.ts +4 -4
  38. package/src/common/buffer/{Types.d.ts → Types.ts} +2 -2
  39. package/src/common/input/WriteBuffer.ts +3 -3
  40. package/src/common/parser/EscapeSequenceParser.ts +4 -4
  41. package/src/common/public/BufferNamespaceApi.ts +3 -3
  42. package/src/common/services/BufferService.ts +7 -7
  43. package/src/common/services/CoreMouseService.ts +5 -3
  44. package/src/common/services/CoreService.ts +6 -6
  45. package/src/common/services/DecorationService.ts +8 -9
  46. package/src/common/services/LogService.ts +2 -2
  47. package/src/common/services/OptionsService.ts +5 -5
  48. package/src/common/services/Services.ts +24 -17
  49. package/src/common/services/UnicodeService.ts +2 -2
  50. package/src/vs/base/browser/browser.ts +141 -0
  51. package/src/vs/base/browser/canIUse.ts +49 -0
  52. package/src/vs/base/browser/dom.ts +2369 -0
  53. package/src/vs/base/browser/fastDomNode.ts +316 -0
  54. package/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  55. package/src/vs/base/browser/iframe.ts +135 -0
  56. package/src/vs/base/browser/keyboardEvent.ts +213 -0
  57. package/src/vs/base/browser/mouseEvent.ts +229 -0
  58. package/src/vs/base/browser/touch.ts +372 -0
  59. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  60. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  61. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  62. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  63. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  64. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  65. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  66. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  67. package/src/vs/base/browser/ui/widget.ts +57 -0
  68. package/src/vs/base/browser/window.ts +14 -0
  69. package/src/vs/base/common/arrays.ts +887 -0
  70. package/src/vs/base/common/arraysFind.ts +202 -0
  71. package/src/vs/base/common/assert.ts +71 -0
  72. package/src/vs/base/common/async.ts +1992 -0
  73. package/src/vs/base/common/cancellation.ts +148 -0
  74. package/src/vs/base/common/charCode.ts +450 -0
  75. package/src/vs/base/common/collections.ts +140 -0
  76. package/src/vs/base/common/decorators.ts +130 -0
  77. package/src/vs/base/common/equals.ts +146 -0
  78. package/src/vs/base/common/errors.ts +303 -0
  79. package/src/vs/base/common/event.ts +1778 -0
  80. package/src/vs/base/common/functional.ts +32 -0
  81. package/src/vs/base/common/hash.ts +316 -0
  82. package/src/vs/base/common/iterator.ts +159 -0
  83. package/src/vs/base/common/keyCodes.ts +526 -0
  84. package/src/vs/base/common/keybindings.ts +284 -0
  85. package/src/vs/base/common/lazy.ts +47 -0
  86. package/src/vs/base/common/lifecycle.ts +801 -0
  87. package/src/vs/base/common/linkedList.ts +142 -0
  88. package/src/vs/base/common/map.ts +202 -0
  89. package/src/vs/base/common/numbers.ts +98 -0
  90. package/src/vs/base/common/observable.ts +76 -0
  91. package/src/vs/base/common/observableInternal/api.ts +31 -0
  92. package/src/vs/base/common/observableInternal/autorun.ts +281 -0
  93. package/src/vs/base/common/observableInternal/base.ts +489 -0
  94. package/src/vs/base/common/observableInternal/debugName.ts +145 -0
  95. package/src/vs/base/common/observableInternal/derived.ts +428 -0
  96. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  97. package/src/vs/base/common/observableInternal/logging.ts +328 -0
  98. package/src/vs/base/common/observableInternal/promise.ts +209 -0
  99. package/src/vs/base/common/observableInternal/utils.ts +610 -0
  100. package/src/vs/base/common/platform.ts +281 -0
  101. package/src/vs/base/common/scrollable.ts +522 -0
  102. package/src/vs/base/common/sequence.ts +34 -0
  103. package/src/vs/base/common/stopwatch.ts +43 -0
  104. package/src/vs/base/common/strings.ts +557 -0
  105. package/src/vs/base/common/symbols.ts +9 -0
  106. package/src/vs/base/common/uint.ts +59 -0
  107. package/src/vs/patches/nls.ts +90 -0
  108. package/src/vs/typings/base-common.d.ts +20 -0
  109. package/src/vs/typings/require.d.ts +42 -0
  110. package/src/vs/typings/thenable.d.ts +12 -0
  111. package/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  112. package/src/vs/typings/vscode-globals-product.d.ts +33 -0
  113. package/typings/xterm.d.ts +59 -15
  114. package/src/browser/Lifecycle.ts +0 -33
  115. package/src/common/EventEmitter.ts +0 -78
  116. package/src/common/Lifecycle.ts +0 -108
  117. /package/src/browser/selection/{Types.d.ts → Types.ts} +0 -0
  118. /package/src/common/parser/{Types.d.ts → Types.ts} +0 -0
@@ -0,0 +1,32 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ /**
7
+ * Given a function, returns a function that is only calling that function once.
8
+ */
9
+ export function createSingleCallFunction<T extends Function>(this: unknown, fn: T, fnDidRunCallback?: () => void): T {
10
+ const _this = this;
11
+ let didCall = false;
12
+ let result: unknown;
13
+
14
+ return function () {
15
+ if (didCall) {
16
+ return result;
17
+ }
18
+
19
+ didCall = true;
20
+ if (fnDidRunCallback) {
21
+ try {
22
+ result = fn.apply(_this, arguments);
23
+ } finally {
24
+ fnDidRunCallback();
25
+ }
26
+ } else {
27
+ result = fn.apply(_this, arguments);
28
+ }
29
+
30
+ return result;
31
+ } as unknown as T;
32
+ }
@@ -0,0 +1,316 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import * as strings from 'vs/base/common/strings';
7
+
8
+ /**
9
+ * Return a hash value for an object.
10
+ */
11
+ export function hash(obj: any): number {
12
+ return doHash(obj, 0);
13
+ }
14
+
15
+ export function doHash(obj: any, hashVal: number): number {
16
+ switch (typeof obj) {
17
+ case 'object':
18
+ if (obj === null) {
19
+ return numberHash(349, hashVal);
20
+ } else if (Array.isArray(obj)) {
21
+ return arrayHash(obj, hashVal);
22
+ }
23
+ return objectHash(obj, hashVal);
24
+ case 'string':
25
+ return stringHash(obj, hashVal);
26
+ case 'boolean':
27
+ return booleanHash(obj, hashVal);
28
+ case 'number':
29
+ return numberHash(obj, hashVal);
30
+ case 'undefined':
31
+ return numberHash(937, hashVal);
32
+ default:
33
+ return numberHash(617, hashVal);
34
+ }
35
+ }
36
+
37
+ export function numberHash(val: number, initialHashVal: number): number {
38
+ return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32
39
+ }
40
+
41
+ function booleanHash(b: boolean, initialHashVal: number): number {
42
+ return numberHash(b ? 433 : 863, initialHashVal);
43
+ }
44
+
45
+ export function stringHash(s: string, hashVal: number) {
46
+ hashVal = numberHash(149417, hashVal);
47
+ for (let i = 0, length = s.length; i < length; i++) {
48
+ hashVal = numberHash(s.charCodeAt(i), hashVal);
49
+ }
50
+ return hashVal;
51
+ }
52
+
53
+ function arrayHash(arr: any[], initialHashVal: number): number {
54
+ initialHashVal = numberHash(104579, initialHashVal);
55
+ return arr.reduce((hashVal, item) => doHash(item, hashVal), initialHashVal);
56
+ }
57
+
58
+ function objectHash(obj: any, initialHashVal: number): number {
59
+ initialHashVal = numberHash(181387, initialHashVal);
60
+ return Object.keys(obj).sort().reduce((hashVal, key) => {
61
+ hashVal = stringHash(key, hashVal);
62
+ return doHash(obj[key], hashVal);
63
+ }, initialHashVal);
64
+ }
65
+
66
+ export class Hasher {
67
+
68
+ private _value = 0;
69
+
70
+ get value(): number {
71
+ return this._value;
72
+ }
73
+
74
+ hash(obj: any): number {
75
+ this._value = doHash(obj, this._value);
76
+ return this._value;
77
+ }
78
+ }
79
+
80
+ const enum SHA1Constant {
81
+ BLOCK_SIZE = 64, // 512 / 8
82
+ UNICODE_REPLACEMENT = 0xFFFD,
83
+ }
84
+
85
+ function leftRotate(value: number, bits: number, totalBits: number = 32): number {
86
+ // delta + bits = totalBits
87
+ const delta = totalBits - bits;
88
+
89
+ // All ones, expect `delta` zeros aligned to the right
90
+ const mask = ~((1 << delta) - 1);
91
+
92
+ // Join (value left-shifted `bits` bits) with (masked value right-shifted `delta` bits)
93
+ return ((value << bits) | ((mask & value) >>> delta)) >>> 0;
94
+ }
95
+
96
+ function fill(dest: Uint8Array, index: number = 0, count: number = dest.byteLength, value: number = 0): void {
97
+ for (let i = 0; i < count; i++) {
98
+ dest[index + i] = value;
99
+ }
100
+ }
101
+
102
+ function leftPad(value: string, length: number, char: string = '0'): string {
103
+ while (value.length < length) {
104
+ value = char + value;
105
+ }
106
+ return value;
107
+ }
108
+
109
+ export function toHexString(buffer: ArrayBuffer): string;
110
+ export function toHexString(value: number, bitsize?: number): string;
111
+ export function toHexString(bufferOrValue: ArrayBuffer | number, bitsize: number = 32): string {
112
+ if (bufferOrValue instanceof ArrayBuffer) {
113
+ return Array.from(new Uint8Array(bufferOrValue)).map(b => b.toString(16).padStart(2, '0')).join('');
114
+ }
115
+
116
+ return leftPad((bufferOrValue >>> 0).toString(16), bitsize / 4);
117
+ }
118
+
119
+ /**
120
+ * A SHA1 implementation that works with strings and does not allocate.
121
+ */
122
+ export class StringSHA1 {
123
+ private static _bigBlock32 = new DataView(new ArrayBuffer(320)); // 80 * 4 = 320
124
+
125
+ private _h0 = 0x67452301;
126
+ private _h1 = 0xEFCDAB89;
127
+ private _h2 = 0x98BADCFE;
128
+ private _h3 = 0x10325476;
129
+ private _h4 = 0xC3D2E1F0;
130
+
131
+ private readonly _buff: Uint8Array;
132
+ private readonly _buffDV: DataView;
133
+ private _buffLen: number;
134
+ private _totalLen: number;
135
+ private _leftoverHighSurrogate: number;
136
+ private _finished: boolean;
137
+
138
+ constructor() {
139
+ this._buff = new Uint8Array(SHA1Constant.BLOCK_SIZE + 3 /* to fit any utf-8 */);
140
+ this._buffDV = new DataView(this._buff.buffer);
141
+ this._buffLen = 0;
142
+ this._totalLen = 0;
143
+ this._leftoverHighSurrogate = 0;
144
+ this._finished = false;
145
+ }
146
+
147
+ public update(str: string): void {
148
+ const strLen = str.length;
149
+ if (strLen === 0) {
150
+ return;
151
+ }
152
+
153
+ const buff = this._buff;
154
+ let buffLen = this._buffLen;
155
+ let leftoverHighSurrogate = this._leftoverHighSurrogate;
156
+ let charCode: number;
157
+ let offset: number;
158
+
159
+ if (leftoverHighSurrogate !== 0) {
160
+ charCode = leftoverHighSurrogate;
161
+ offset = -1;
162
+ leftoverHighSurrogate = 0;
163
+ } else {
164
+ charCode = str.charCodeAt(0);
165
+ offset = 0;
166
+ }
167
+
168
+ while (true) {
169
+ let codePoint = charCode;
170
+ if (strings.isHighSurrogate(charCode)) {
171
+ if (offset + 1 < strLen) {
172
+ const nextCharCode = str.charCodeAt(offset + 1);
173
+ if (strings.isLowSurrogate(nextCharCode)) {
174
+ offset++;
175
+ codePoint = strings.computeCodePoint(charCode, nextCharCode);
176
+ } else {
177
+ // illegal => unicode replacement character
178
+ codePoint = SHA1Constant.UNICODE_REPLACEMENT;
179
+ }
180
+ } else {
181
+ // last character is a surrogate pair
182
+ leftoverHighSurrogate = charCode;
183
+ break;
184
+ }
185
+ } else if (strings.isLowSurrogate(charCode)) {
186
+ // illegal => unicode replacement character
187
+ codePoint = SHA1Constant.UNICODE_REPLACEMENT;
188
+ }
189
+
190
+ buffLen = this._push(buff, buffLen, codePoint);
191
+ offset++;
192
+ if (offset < strLen) {
193
+ charCode = str.charCodeAt(offset);
194
+ } else {
195
+ break;
196
+ }
197
+ }
198
+
199
+ this._buffLen = buffLen;
200
+ this._leftoverHighSurrogate = leftoverHighSurrogate;
201
+ }
202
+
203
+ private _push(buff: Uint8Array, buffLen: number, codePoint: number): number {
204
+ if (codePoint < 0x0080) {
205
+ buff[buffLen++] = codePoint;
206
+ } else if (codePoint < 0x0800) {
207
+ buff[buffLen++] = 0b11000000 | ((codePoint & 0b00000000000000000000011111000000) >>> 6);
208
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);
209
+ } else if (codePoint < 0x10000) {
210
+ buff[buffLen++] = 0b11100000 | ((codePoint & 0b00000000000000001111000000000000) >>> 12);
211
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);
212
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);
213
+ } else {
214
+ buff[buffLen++] = 0b11110000 | ((codePoint & 0b00000000000111000000000000000000) >>> 18);
215
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000111111000000000000) >>> 12);
216
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000111111000000) >>> 6);
217
+ buff[buffLen++] = 0b10000000 | ((codePoint & 0b00000000000000000000000000111111) >>> 0);
218
+ }
219
+
220
+ if (buffLen >= SHA1Constant.BLOCK_SIZE) {
221
+ this._step();
222
+ buffLen -= SHA1Constant.BLOCK_SIZE;
223
+ this._totalLen += SHA1Constant.BLOCK_SIZE;
224
+ // take last 3 in case of UTF8 overflow
225
+ buff[0] = buff[SHA1Constant.BLOCK_SIZE + 0];
226
+ buff[1] = buff[SHA1Constant.BLOCK_SIZE + 1];
227
+ buff[2] = buff[SHA1Constant.BLOCK_SIZE + 2];
228
+ }
229
+
230
+ return buffLen;
231
+ }
232
+
233
+ public digest(): string {
234
+ if (!this._finished) {
235
+ this._finished = true;
236
+ if (this._leftoverHighSurrogate) {
237
+ // illegal => unicode replacement character
238
+ this._leftoverHighSurrogate = 0;
239
+ this._buffLen = this._push(this._buff, this._buffLen, SHA1Constant.UNICODE_REPLACEMENT);
240
+ }
241
+ this._totalLen += this._buffLen;
242
+ this._wrapUp();
243
+ }
244
+
245
+ return toHexString(this._h0) + toHexString(this._h1) + toHexString(this._h2) + toHexString(this._h3) + toHexString(this._h4);
246
+ }
247
+
248
+ private _wrapUp(): void {
249
+ this._buff[this._buffLen++] = 0x80;
250
+ fill(this._buff, this._buffLen);
251
+
252
+ if (this._buffLen > 56) {
253
+ this._step();
254
+ fill(this._buff);
255
+ }
256
+
257
+ // this will fit because the mantissa can cover up to 52 bits
258
+ const ml = 8 * this._totalLen;
259
+
260
+ this._buffDV.setUint32(56, Math.floor(ml / 4294967296), false);
261
+ this._buffDV.setUint32(60, ml % 4294967296, false);
262
+
263
+ this._step();
264
+ }
265
+
266
+ private _step(): void {
267
+ const bigBlock32 = StringSHA1._bigBlock32;
268
+ const data = this._buffDV;
269
+
270
+ for (let j = 0; j < 64 /* 16*4 */; j += 4) {
271
+ bigBlock32.setUint32(j, data.getUint32(j, false), false);
272
+ }
273
+
274
+ for (let j = 64; j < 320 /* 80*4 */; j += 4) {
275
+ bigBlock32.setUint32(j, leftRotate((bigBlock32.getUint32(j - 12, false) ^ bigBlock32.getUint32(j - 32, false) ^ bigBlock32.getUint32(j - 56, false) ^ bigBlock32.getUint32(j - 64, false)), 1), false);
276
+ }
277
+
278
+ let a = this._h0;
279
+ let b = this._h1;
280
+ let c = this._h2;
281
+ let d = this._h3;
282
+ let e = this._h4;
283
+
284
+ let f: number, k: number;
285
+ let temp: number;
286
+
287
+ for (let j = 0; j < 80; j++) {
288
+ if (j < 20) {
289
+ f = (b & c) | ((~b) & d);
290
+ k = 0x5A827999;
291
+ } else if (j < 40) {
292
+ f = b ^ c ^ d;
293
+ k = 0x6ED9EBA1;
294
+ } else if (j < 60) {
295
+ f = (b & c) | (b & d) | (c & d);
296
+ k = 0x8F1BBCDC;
297
+ } else {
298
+ f = b ^ c ^ d;
299
+ k = 0xCA62C1D6;
300
+ }
301
+
302
+ temp = (leftRotate(a, 5) + f + e + k + bigBlock32.getUint32(j * 4, false)) & 0xffffffff;
303
+ e = d;
304
+ d = c;
305
+ c = leftRotate(b, 30);
306
+ b = a;
307
+ a = temp;
308
+ }
309
+
310
+ this._h0 = (this._h0 + a) & 0xffffffff;
311
+ this._h1 = (this._h1 + b) & 0xffffffff;
312
+ this._h2 = (this._h2 + c) & 0xffffffff;
313
+ this._h3 = (this._h3 + d) & 0xffffffff;
314
+ this._h4 = (this._h4 + e) & 0xffffffff;
315
+ }
316
+ }
@@ -0,0 +1,159 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ export namespace Iterable {
7
+
8
+ export function is<T = any>(thing: any): thing is Iterable<T> {
9
+ return thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function';
10
+ }
11
+
12
+ const _empty: Iterable<any> = Object.freeze([]);
13
+ export function empty<T = any>(): Iterable<T> {
14
+ return _empty;
15
+ }
16
+
17
+ export function* single<T>(element: T): Iterable<T> {
18
+ yield element;
19
+ }
20
+
21
+ export function wrap<T>(iterableOrElement: Iterable<T> | T): Iterable<T> {
22
+ if (is(iterableOrElement)) {
23
+ return iterableOrElement;
24
+ } else {
25
+ return single(iterableOrElement);
26
+ }
27
+ }
28
+
29
+ export function from<T>(iterable: Iterable<T> | undefined | null): Iterable<T> {
30
+ return iterable || _empty;
31
+ }
32
+
33
+ export function* reverse<T>(array: Array<T>): Iterable<T> {
34
+ for (let i = array.length - 1; i >= 0; i--) {
35
+ yield array[i];
36
+ }
37
+ }
38
+
39
+ export function isEmpty<T>(iterable: Iterable<T> | undefined | null): boolean {
40
+ return !iterable || iterable[Symbol.iterator]().next().done === true;
41
+ }
42
+
43
+ export function first<T>(iterable: Iterable<T>): T | undefined {
44
+ return iterable[Symbol.iterator]().next().value;
45
+ }
46
+
47
+ export function some<T>(iterable: Iterable<T>, predicate: (t: T, i: number) => unknown): boolean {
48
+ let i = 0;
49
+ for (const element of iterable) {
50
+ if (predicate(element, i++)) {
51
+ return true;
52
+ }
53
+ }
54
+ return false;
55
+ }
56
+
57
+ export function find<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): R | undefined;
58
+ export function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined;
59
+ export function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined {
60
+ for (const element of iterable) {
61
+ if (predicate(element)) {
62
+ return element;
63
+ }
64
+ }
65
+
66
+ return undefined;
67
+ }
68
+
69
+ export function filter<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): Iterable<R>;
70
+ export function filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T>;
71
+ export function* filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T> {
72
+ for (const element of iterable) {
73
+ if (predicate(element)) {
74
+ yield element;
75
+ }
76
+ }
77
+ }
78
+
79
+ export function* map<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => R): Iterable<R> {
80
+ let index = 0;
81
+ for (const element of iterable) {
82
+ yield fn(element, index++);
83
+ }
84
+ }
85
+
86
+ export function* flatMap<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => Iterable<R>): Iterable<R> {
87
+ let index = 0;
88
+ for (const element of iterable) {
89
+ yield* fn(element, index++);
90
+ }
91
+ }
92
+
93
+ export function* concat<T>(...iterables: Iterable<T>[]): Iterable<T> {
94
+ for (const iterable of iterables) {
95
+ yield* iterable;
96
+ }
97
+ }
98
+
99
+ export function reduce<T, R>(iterable: Iterable<T>, reducer: (previousValue: R, currentValue: T) => R, initialValue: R): R {
100
+ let value = initialValue;
101
+ for (const element of iterable) {
102
+ value = reducer(value, element);
103
+ }
104
+ return value;
105
+ }
106
+
107
+ /**
108
+ * Returns an iterable slice of the array, with the same semantics as `array.slice()`.
109
+ */
110
+ export function* slice<T>(arr: ReadonlyArray<T>, from: number, to = arr.length): Iterable<T> {
111
+ if (from < 0) {
112
+ from += arr.length;
113
+ }
114
+
115
+ if (to < 0) {
116
+ to += arr.length;
117
+ } else if (to > arr.length) {
118
+ to = arr.length;
119
+ }
120
+
121
+ for (; from < to; from++) {
122
+ yield arr[from];
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Consumes `atMost` elements from iterable and returns the consumed elements,
128
+ * and an iterable for the rest of the elements.
129
+ */
130
+ export function consume<T>(iterable: Iterable<T>, atMost: number = Number.POSITIVE_INFINITY): [T[], Iterable<T>] {
131
+ const consumed: T[] = [];
132
+
133
+ if (atMost === 0) {
134
+ return [consumed, iterable];
135
+ }
136
+
137
+ const iterator = iterable[Symbol.iterator]();
138
+
139
+ for (let i = 0; i < atMost; i++) {
140
+ const next = iterator.next();
141
+
142
+ if (next.done) {
143
+ return [consumed, Iterable.empty()];
144
+ }
145
+
146
+ consumed.push(next.value);
147
+ }
148
+
149
+ return [consumed, { [Symbol.iterator]() { return iterator; } }];
150
+ }
151
+
152
+ export async function asyncToArray<T>(iterable: AsyncIterable<T>): Promise<T[]> {
153
+ const result: T[] = [];
154
+ for await (const item of iterable) {
155
+ result.push(item);
156
+ }
157
+ return Promise.resolve(result);
158
+ }
159
+ }