@xterm/xterm 6.1.0-beta.20 → 6.1.0-beta.200

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