@xterm/xterm 6.1.0-beta.24 → 6.1.0-beta.240

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 (162) hide show
  1. package/README.md +62 -38
  2. package/css/xterm.css +29 -22
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +8 -34
  6. package/lib/xterm.mjs.map +4 -4
  7. package/package.json +25 -22
  8. package/src/browser/AccessibilityManager.ts +11 -6
  9. package/src/browser/Clipboard.ts +6 -3
  10. package/src/browser/CoreBrowserTerminal.ts +149 -319
  11. package/src/browser/Dom.ts +178 -0
  12. package/src/browser/Linkifier.ts +11 -11
  13. package/src/browser/OscLinkProvider.ts +82 -14
  14. package/src/browser/RenderDebouncer.ts +2 -2
  15. package/src/browser/TimeBasedDebouncer.ts +2 -2
  16. package/src/browser/Types.ts +12 -11
  17. package/src/browser/Viewport.ts +55 -20
  18. package/src/browser/decorations/BufferDecorationRenderer.ts +1 -1
  19. package/src/browser/decorations/OverviewRulerRenderer.ts +33 -17
  20. package/src/browser/input/CompositionHelper.ts +44 -8
  21. package/src/browser/public/Terminal.ts +25 -28
  22. package/src/browser/renderer/dom/DomRenderer.ts +242 -76
  23. package/src/browser/renderer/dom/DomRendererRowFactory.ts +19 -13
  24. package/src/browser/renderer/dom/WidthCache.ts +54 -52
  25. package/src/browser/renderer/shared/Constants.ts +7 -0
  26. package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
  27. package/src/browser/renderer/shared/Types.ts +8 -2
  28. package/src/browser/scrollable/abstractScrollbar.ts +300 -0
  29. package/src/browser/scrollable/fastDomNode.ts +126 -0
  30. package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
  31. package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
  32. package/src/browser/scrollable/mouseEvent.ts +292 -0
  33. package/src/browser/scrollable/scrollable.ts +486 -0
  34. package/src/browser/scrollable/scrollableElement.ts +581 -0
  35. package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
  36. package/src/browser/scrollable/scrollbarArrow.ts +110 -0
  37. package/src/browser/scrollable/scrollbarState.ts +246 -0
  38. package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
  39. package/src/browser/scrollable/touch.ts +485 -0
  40. package/src/browser/scrollable/verticalScrollbar.ts +143 -0
  41. package/src/browser/scrollable/widget.ts +23 -0
  42. package/src/browser/services/CharSizeService.ts +2 -2
  43. package/src/browser/services/CoreBrowserService.ts +7 -5
  44. package/src/browser/services/KeyboardService.ts +67 -0
  45. package/src/browser/services/LinkProviderService.ts +1 -1
  46. package/src/browser/services/MouseCoordsService.ts +47 -0
  47. package/src/browser/services/MouseService.ts +518 -25
  48. package/src/browser/services/RenderService.ts +28 -16
  49. package/src/browser/services/SelectionService.ts +45 -39
  50. package/src/browser/services/Services.ts +40 -17
  51. package/src/browser/services/ThemeService.ts +2 -2
  52. package/src/common/Async.ts +141 -0
  53. package/src/common/CircularList.ts +2 -2
  54. package/src/common/Color.ts +8 -0
  55. package/src/common/CoreTerminal.ts +31 -21
  56. package/src/common/Event.ts +118 -0
  57. package/src/common/InputHandler.ts +283 -85
  58. package/src/common/Lifecycle.ts +113 -0
  59. package/src/common/Platform.ts +13 -3
  60. package/src/common/SortedList.ts +7 -3
  61. package/src/common/StringBuilder.ts +67 -0
  62. package/src/common/TaskQueue.ts +14 -5
  63. package/src/common/Types.ts +51 -31
  64. package/src/common/Version.ts +9 -0
  65. package/src/common/buffer/Buffer.ts +34 -19
  66. package/src/common/buffer/BufferLine.ts +133 -65
  67. package/src/common/buffer/BufferLineStringCache.ts +69 -0
  68. package/src/common/buffer/BufferSet.ts +11 -6
  69. package/src/common/buffer/CellData.ts +57 -0
  70. package/src/common/buffer/Marker.ts +2 -2
  71. package/src/common/buffer/Types.ts +6 -2
  72. package/src/common/data/EscapeSequences.ts +71 -70
  73. package/src/common/input/Keyboard.ts +14 -7
  74. package/src/common/input/KittyKeyboard.ts +526 -0
  75. package/src/common/input/Win32InputMode.ts +297 -0
  76. package/src/common/input/WriteBuffer.ts +69 -32
  77. package/src/common/input/XParseColor.ts +2 -2
  78. package/src/common/parser/ApcParser.ts +196 -0
  79. package/src/common/parser/Constants.ts +14 -4
  80. package/src/common/parser/DcsParser.ts +11 -12
  81. package/src/common/parser/EscapeSequenceParser.ts +205 -63
  82. package/src/common/parser/OscParser.ts +11 -12
  83. package/src/common/parser/Params.ts +27 -8
  84. package/src/common/parser/Types.ts +36 -2
  85. package/src/common/public/BufferLineApiView.ts +2 -2
  86. package/src/common/public/BufferNamespaceApi.ts +3 -3
  87. package/src/common/public/ParserApi.ts +3 -0
  88. package/src/common/services/BufferService.ts +14 -9
  89. package/src/common/services/CharsetService.ts +4 -0
  90. package/src/common/services/CoreService.ts +22 -9
  91. package/src/common/services/DecorationService.ts +258 -8
  92. package/src/common/services/LogService.ts +1 -31
  93. package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
  94. package/src/common/services/OptionsService.ts +13 -4
  95. package/src/common/services/ServiceRegistry.ts +9 -7
  96. package/src/common/services/Services.ts +49 -40
  97. package/src/common/services/UnicodeService.ts +1 -1
  98. package/typings/xterm.d.ts +318 -34
  99. package/src/common/Clone.ts +0 -23
  100. package/src/common/TypedArrayUtils.ts +0 -17
  101. package/src/vs/base/browser/browser.ts +0 -141
  102. package/src/vs/base/browser/canIUse.ts +0 -49
  103. package/src/vs/base/browser/dom.ts +0 -2369
  104. package/src/vs/base/browser/fastDomNode.ts +0 -316
  105. package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
  106. package/src/vs/base/browser/iframe.ts +0 -135
  107. package/src/vs/base/browser/keyboardEvent.ts +0 -213
  108. package/src/vs/base/browser/mouseEvent.ts +0 -229
  109. package/src/vs/base/browser/touch.ts +0 -372
  110. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
  111. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
  112. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
  113. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
  114. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
  115. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
  116. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
  117. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
  118. package/src/vs/base/browser/ui/widget.ts +0 -57
  119. package/src/vs/base/browser/window.ts +0 -14
  120. package/src/vs/base/common/arrays.ts +0 -887
  121. package/src/vs/base/common/arraysFind.ts +0 -202
  122. package/src/vs/base/common/assert.ts +0 -71
  123. package/src/vs/base/common/async.ts +0 -1992
  124. package/src/vs/base/common/cancellation.ts +0 -148
  125. package/src/vs/base/common/charCode.ts +0 -450
  126. package/src/vs/base/common/collections.ts +0 -140
  127. package/src/vs/base/common/decorators.ts +0 -130
  128. package/src/vs/base/common/equals.ts +0 -146
  129. package/src/vs/base/common/errors.ts +0 -303
  130. package/src/vs/base/common/event.ts +0 -1778
  131. package/src/vs/base/common/functional.ts +0 -32
  132. package/src/vs/base/common/hash.ts +0 -316
  133. package/src/vs/base/common/iterator.ts +0 -159
  134. package/src/vs/base/common/keyCodes.ts +0 -526
  135. package/src/vs/base/common/keybindings.ts +0 -284
  136. package/src/vs/base/common/lazy.ts +0 -47
  137. package/src/vs/base/common/lifecycle.ts +0 -801
  138. package/src/vs/base/common/linkedList.ts +0 -142
  139. package/src/vs/base/common/map.ts +0 -202
  140. package/src/vs/base/common/numbers.ts +0 -98
  141. package/src/vs/base/common/observable.ts +0 -76
  142. package/src/vs/base/common/observableInternal/api.ts +0 -31
  143. package/src/vs/base/common/observableInternal/autorun.ts +0 -281
  144. package/src/vs/base/common/observableInternal/base.ts +0 -489
  145. package/src/vs/base/common/observableInternal/debugName.ts +0 -145
  146. package/src/vs/base/common/observableInternal/derived.ts +0 -428
  147. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
  148. package/src/vs/base/common/observableInternal/logging.ts +0 -328
  149. package/src/vs/base/common/observableInternal/promise.ts +0 -209
  150. package/src/vs/base/common/observableInternal/utils.ts +0 -610
  151. package/src/vs/base/common/platform.ts +0 -281
  152. package/src/vs/base/common/scrollable.ts +0 -522
  153. package/src/vs/base/common/sequence.ts +0 -34
  154. package/src/vs/base/common/stopwatch.ts +0 -43
  155. package/src/vs/base/common/strings.ts +0 -557
  156. package/src/vs/base/common/symbols.ts +0 -9
  157. package/src/vs/base/common/uint.ts +0 -59
  158. package/src/vs/patches/nls.ts +0 -90
  159. package/src/vs/typings/base-common.d.ts +0 -20
  160. package/src/vs/typings/require.d.ts +0 -42
  161. package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
  162. package/src/vs/typings/vscode-globals-product.d.ts +0 -33
@@ -1,32 +0,0 @@
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
- }
@@ -1,316 +0,0 @@
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
- }
@@ -1,159 +0,0 @@
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
- }