@xterm/xterm 6.1.0-beta.25 → 6.1.0-beta.250

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 (163) 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 +32 -22
  56. package/src/common/Event.ts +118 -0
  57. package/src/common/InputHandler.ts +286 -87
  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 +140 -68
  67. package/src/common/buffer/BufferLineStringCache.ts +69 -0
  68. package/src/common/buffer/BufferReflow.ts +4 -1
  69. package/src/common/buffer/BufferSet.ts +11 -6
  70. package/src/common/buffer/CellData.ts +57 -0
  71. package/src/common/buffer/Marker.ts +2 -2
  72. package/src/common/buffer/Types.ts +6 -2
  73. package/src/common/data/EscapeSequences.ts +71 -70
  74. package/src/common/input/Keyboard.ts +14 -7
  75. package/src/common/input/KittyKeyboard.ts +526 -0
  76. package/src/common/input/Win32InputMode.ts +297 -0
  77. package/src/common/input/WriteBuffer.ts +107 -38
  78. package/src/common/input/XParseColor.ts +2 -2
  79. package/src/common/parser/ApcParser.ts +196 -0
  80. package/src/common/parser/Constants.ts +14 -4
  81. package/src/common/parser/DcsParser.ts +11 -12
  82. package/src/common/parser/EscapeSequenceParser.ts +205 -63
  83. package/src/common/parser/OscParser.ts +11 -12
  84. package/src/common/parser/Params.ts +27 -8
  85. package/src/common/parser/Types.ts +36 -2
  86. package/src/common/public/BufferLineApiView.ts +2 -2
  87. package/src/common/public/BufferNamespaceApi.ts +3 -3
  88. package/src/common/public/ParserApi.ts +3 -0
  89. package/src/common/services/BufferService.ts +14 -9
  90. package/src/common/services/CharsetService.ts +4 -0
  91. package/src/common/services/CoreService.ts +22 -9
  92. package/src/common/services/DecorationService.ts +255 -8
  93. package/src/common/services/LogService.ts +1 -31
  94. package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
  95. package/src/common/services/OptionsService.ts +13 -4
  96. package/src/common/services/ServiceRegistry.ts +9 -7
  97. package/src/common/services/Services.ts +49 -40
  98. package/src/common/services/UnicodeService.ts +1 -1
  99. package/typings/xterm.d.ts +318 -34
  100. package/src/common/Clone.ts +0 -23
  101. package/src/common/TypedArrayUtils.ts +0 -17
  102. package/src/vs/base/browser/browser.ts +0 -141
  103. package/src/vs/base/browser/canIUse.ts +0 -49
  104. package/src/vs/base/browser/dom.ts +0 -2369
  105. package/src/vs/base/browser/fastDomNode.ts +0 -316
  106. package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
  107. package/src/vs/base/browser/iframe.ts +0 -135
  108. package/src/vs/base/browser/keyboardEvent.ts +0 -213
  109. package/src/vs/base/browser/mouseEvent.ts +0 -229
  110. package/src/vs/base/browser/touch.ts +0 -372
  111. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
  112. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
  113. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
  114. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
  115. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
  116. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
  117. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
  118. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
  119. package/src/vs/base/browser/ui/widget.ts +0 -57
  120. package/src/vs/base/browser/window.ts +0 -14
  121. package/src/vs/base/common/arrays.ts +0 -887
  122. package/src/vs/base/common/arraysFind.ts +0 -202
  123. package/src/vs/base/common/assert.ts +0 -71
  124. package/src/vs/base/common/async.ts +0 -1992
  125. package/src/vs/base/common/cancellation.ts +0 -148
  126. package/src/vs/base/common/charCode.ts +0 -450
  127. package/src/vs/base/common/collections.ts +0 -140
  128. package/src/vs/base/common/decorators.ts +0 -130
  129. package/src/vs/base/common/equals.ts +0 -146
  130. package/src/vs/base/common/errors.ts +0 -303
  131. package/src/vs/base/common/event.ts +0 -1778
  132. package/src/vs/base/common/functional.ts +0 -32
  133. package/src/vs/base/common/hash.ts +0 -316
  134. package/src/vs/base/common/iterator.ts +0 -159
  135. package/src/vs/base/common/keyCodes.ts +0 -526
  136. package/src/vs/base/common/keybindings.ts +0 -284
  137. package/src/vs/base/common/lazy.ts +0 -47
  138. package/src/vs/base/common/lifecycle.ts +0 -801
  139. package/src/vs/base/common/linkedList.ts +0 -142
  140. package/src/vs/base/common/map.ts +0 -202
  141. package/src/vs/base/common/numbers.ts +0 -98
  142. package/src/vs/base/common/observable.ts +0 -76
  143. package/src/vs/base/common/observableInternal/api.ts +0 -31
  144. package/src/vs/base/common/observableInternal/autorun.ts +0 -281
  145. package/src/vs/base/common/observableInternal/base.ts +0 -489
  146. package/src/vs/base/common/observableInternal/debugName.ts +0 -145
  147. package/src/vs/base/common/observableInternal/derived.ts +0 -428
  148. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
  149. package/src/vs/base/common/observableInternal/logging.ts +0 -328
  150. package/src/vs/base/common/observableInternal/promise.ts +0 -209
  151. package/src/vs/base/common/observableInternal/utils.ts +0 -610
  152. package/src/vs/base/common/platform.ts +0 -281
  153. package/src/vs/base/common/scrollable.ts +0 -522
  154. package/src/vs/base/common/sequence.ts +0 -34
  155. package/src/vs/base/common/stopwatch.ts +0 -43
  156. package/src/vs/base/common/strings.ts +0 -557
  157. package/src/vs/base/common/symbols.ts +0 -9
  158. package/src/vs/base/common/uint.ts +0 -59
  159. package/src/vs/patches/nls.ts +0 -90
  160. package/src/vs/typings/base-common.d.ts +0 -20
  161. package/src/vs/typings/require.d.ts +0 -42
  162. package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
  163. 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
- }