@fable-org/fable-library-ts 1.0.0-beta-001
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.
- package/Array.ts +1362 -0
- package/Async.ts +207 -0
- package/AsyncBuilder.ts +222 -0
- package/BigInt.ts +337 -0
- package/BitConverter.ts +165 -0
- package/Boolean.ts +22 -0
- package/CHANGELOG.md +15 -0
- package/Char.ts +222 -0
- package/Choice.ts +300 -0
- package/Date.ts +495 -0
- package/DateOffset.ts +324 -0
- package/DateOnly.ts +146 -0
- package/Decimal.ts +250 -0
- package/Double.ts +55 -0
- package/Encoding.ts +170 -0
- package/Event.ts +119 -0
- package/FSharp.Collections.ts +34 -0
- package/FSharp.Core.CompilerServices.ts +37 -0
- package/FSharp.Core.ts +86 -0
- package/Global.ts +37 -0
- package/Guid.ts +143 -0
- package/Int32.ts +156 -0
- package/List.ts +1417 -0
- package/Long.ts +49 -0
- package/MailboxProcessor.ts +125 -0
- package/Map.ts +1552 -0
- package/MapUtil.ts +120 -0
- package/MutableMap.ts +344 -0
- package/MutableSet.ts +248 -0
- package/Native.ts +11 -0
- package/Numeric.ts +80 -0
- package/Observable.ts +156 -0
- package/Option.ts +137 -0
- package/README.md +3 -0
- package/Random.ts +196 -0
- package/Range.ts +56 -0
- package/Reflection.ts +539 -0
- package/RegExp.ts +143 -0
- package/Result.ts +196 -0
- package/Seq.ts +1526 -0
- package/Seq2.ts +129 -0
- package/Set.ts +1955 -0
- package/String.ts +589 -0
- package/System.Collections.Generic.ts +380 -0
- package/System.Text.ts +137 -0
- package/SystemException.ts +7 -0
- package/TimeOnly.ts +131 -0
- package/TimeSpan.ts +194 -0
- package/Timer.ts +80 -0
- package/Types.ts +231 -0
- package/Unicode.13.0.0.ts +4 -0
- package/Uri.ts +206 -0
- package/Util.ts +928 -0
- package/lib/big.d.ts +338 -0
- package/lib/big.js +1054 -0
- package/package.json +24 -0
- package/tsconfig.json +103 -0
package/Util.ts
ADDED
|
@@ -0,0 +1,928 @@
|
|
|
1
|
+
// tslint:disable:ban-types
|
|
2
|
+
|
|
3
|
+
// Don't change, this corresponds to DateTime.Kind enum values in .NET
|
|
4
|
+
export const enum DateKind {
|
|
5
|
+
Unspecified = 0,
|
|
6
|
+
UTC = 1,
|
|
7
|
+
Local = 2,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IDateTime extends Date {
|
|
11
|
+
kind?: DateKind;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface IDateTimeOffset extends Date {
|
|
15
|
+
offset?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface IComparable<T> extends IEquatable<T> {
|
|
19
|
+
CompareTo(x: T): number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IEquatable<T> {
|
|
23
|
+
Equals(x: T): boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface IHashable {
|
|
27
|
+
GetHashCode(): number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface IDisposable {
|
|
31
|
+
Dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface IComparer<T> {
|
|
35
|
+
Compare(x: T, y: T): number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface IEqualityComparer<T> {
|
|
39
|
+
Equals(x: T, y: T): boolean;
|
|
40
|
+
GetHashCode(x: T): number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface ICollection<T> extends Iterable<T> {
|
|
44
|
+
readonly Count: number;
|
|
45
|
+
readonly IsReadOnly: boolean;
|
|
46
|
+
Add(item: T): void;
|
|
47
|
+
Clear(): void;
|
|
48
|
+
Contains(item: T): boolean;
|
|
49
|
+
CopyTo(array: T[], arrayIndex: number): void;
|
|
50
|
+
Remove(item: T): boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function isArrayLike<T>(x: T | ArrayLike<T> | Iterable<T>): x is T[] {
|
|
54
|
+
return Array.isArray(x) || ArrayBuffer.isView(x);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isIterable<T>(x: T | ArrayLike<T> | Iterable<T>): x is Iterable<T> {
|
|
58
|
+
return x != null && typeof x === "object" && Symbol.iterator in x;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function isEnumerable<T>(x: T | Iterable<T>): x is IEnumerable<T> {
|
|
62
|
+
return x != null && typeof (x as IEnumerable<T>).GetEnumerator === "function"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isComparer<T>(x: T | IComparer<T>): x is IComparer<T> {
|
|
66
|
+
return x != null && typeof (x as IComparer<T>).Compare === "function";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function isComparable<T>(x: T | IComparable<T>): x is IComparable<T> {
|
|
70
|
+
return x != null && typeof (x as IComparable<T>).CompareTo === "function";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function isEquatable<T>(x: T | IEquatable<T>): x is IEquatable<T> {
|
|
74
|
+
return x != null && typeof (x as IEquatable<T>).Equals === "function";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function isHashable<T>(x: T | IHashable): x is IHashable {
|
|
78
|
+
return x != null && typeof (x as IHashable).GetHashCode === "function";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function isDisposable<T>(x: T | IDisposable): x is IDisposable {
|
|
82
|
+
return x != null && typeof (x as IDisposable).Dispose === "function";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function disposeSafe(x: any) {
|
|
86
|
+
if (isDisposable(x)) {
|
|
87
|
+
x.Dispose();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function defaultOf<T>(): T {
|
|
92
|
+
return null as T;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function sameConstructor<T>(x: T, y: T) {
|
|
96
|
+
return Object.getPrototypeOf(x)?.constructor === Object.getPrototypeOf(y)?.constructor;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface IEnumerator<T> extends IDisposable {
|
|
100
|
+
["System.Collections.Generic.IEnumerator`1.get_Current"](): T;
|
|
101
|
+
["System.Collections.IEnumerator.get_Current"](): T;
|
|
102
|
+
["System.Collections.IEnumerator.MoveNext"](): boolean;
|
|
103
|
+
["System.Collections.IEnumerator.Reset"](): void;
|
|
104
|
+
Dispose(): void;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface IEnumerable<T> extends Iterable<T> {
|
|
108
|
+
GetEnumerator(): IEnumerator<T>;
|
|
109
|
+
"System.Collections.IEnumerable.GetEnumerator"(): IEnumerator<any>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export class Enumerable<T> implements IEnumerable<T> {
|
|
113
|
+
constructor(private en: IEnumerator<T>) {}
|
|
114
|
+
public GetEnumerator(): IEnumerator<T> { return this.en; }
|
|
115
|
+
public "System.Collections.IEnumerable.GetEnumerator"(): IEnumerator<any> { return this.en; }
|
|
116
|
+
[Symbol.iterator]() {
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
next() {
|
|
120
|
+
const hasNext = this.en["System.Collections.IEnumerator.MoveNext"]();
|
|
121
|
+
const current = hasNext ? this.en["System.Collections.Generic.IEnumerator`1.get_Current"]() : undefined;
|
|
122
|
+
return { done: !hasNext, value: current } as IteratorResult<T>;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export class Enumerator<T> implements IEnumerator<T> {
|
|
127
|
+
private current: T = defaultOf();
|
|
128
|
+
constructor(private iter: Iterator<T>) { }
|
|
129
|
+
public ["System.Collections.Generic.IEnumerator`1.get_Current"]() {
|
|
130
|
+
return this.current;
|
|
131
|
+
}
|
|
132
|
+
public ["System.Collections.IEnumerator.get_Current"]() {
|
|
133
|
+
return this.current;
|
|
134
|
+
}
|
|
135
|
+
public ["System.Collections.IEnumerator.MoveNext"]() {
|
|
136
|
+
const cur = this.iter.next();
|
|
137
|
+
this.current = cur.value;
|
|
138
|
+
return !cur.done;
|
|
139
|
+
}
|
|
140
|
+
public ["System.Collections.IEnumerator.Reset"]() {
|
|
141
|
+
throw new Error("JS iterators cannot be reset");
|
|
142
|
+
}
|
|
143
|
+
public Dispose() {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function toEnumerable<T>(e: IEnumerable<T> | Iterable<T>): IEnumerable<T> {
|
|
149
|
+
if (isEnumerable(e)) { return e; }
|
|
150
|
+
else { return new Enumerable(new Enumerator(e[Symbol.iterator]())); }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function getEnumerator<T>(e: IEnumerable<T> | Iterable<T>): IEnumerator<T> {
|
|
154
|
+
if (isEnumerable(e)) { return e.GetEnumerator(); }
|
|
155
|
+
else { return new Enumerator(e[Symbol.iterator]()); }
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function toIterator<T>(en: IEnumerator<T>): Iterator<T> {
|
|
159
|
+
return {
|
|
160
|
+
next() {
|
|
161
|
+
const hasNext = en["System.Collections.IEnumerator.MoveNext"]();
|
|
162
|
+
const current = hasNext ? en["System.Collections.Generic.IEnumerator`1.get_Current"]() : undefined;
|
|
163
|
+
return { done: !hasNext, value: current } as IteratorResult<T>;
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function enumerableToIterator<T>(e: IEnumerable<T> | Iterable<T>): Iterator<T> {
|
|
169
|
+
return toIterator(toEnumerable(e).GetEnumerator());
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface ISet<T> {
|
|
173
|
+
add(value: T): ISet<T>;
|
|
174
|
+
clear(): void;
|
|
175
|
+
delete(value: T): boolean;
|
|
176
|
+
forEach(callbackfn: (value: T, value2: T, set: ISet<T>) => void, thisArg?: any): void;
|
|
177
|
+
has(value: T): boolean;
|
|
178
|
+
readonly size: number;
|
|
179
|
+
|
|
180
|
+
[Symbol.iterator](): Iterator<T>;
|
|
181
|
+
entries(): Iterable<[T, T]>;
|
|
182
|
+
keys(): Iterable<T>;
|
|
183
|
+
values(): Iterable<T>;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface IMap<K, V> {
|
|
187
|
+
clear(): void;
|
|
188
|
+
delete(key: K): boolean;
|
|
189
|
+
forEach(callbackfn: (value: V, key: K, map: IMap<K, V>) => void, thisArg?: any): void;
|
|
190
|
+
get(key: K): V | undefined;
|
|
191
|
+
has(key: K): boolean;
|
|
192
|
+
set(key: K, value: V): IMap<K, V>;
|
|
193
|
+
readonly size: number;
|
|
194
|
+
|
|
195
|
+
[Symbol.iterator](): Iterator<[K, V]>;
|
|
196
|
+
entries(): Iterable<[K, V]>;
|
|
197
|
+
keys(): Iterable<K>;
|
|
198
|
+
values(): Iterable<V>;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export class Comparer<T> implements IComparer<T> {
|
|
202
|
+
public Compare: (x: T, y: T) => number;
|
|
203
|
+
|
|
204
|
+
constructor(f?: (x: T, y: T) => number) {
|
|
205
|
+
this.Compare = f || compare;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function comparerFromEqualityComparer<T>(comparer: IEqualityComparer<T>): IComparer<T> {
|
|
210
|
+
// Sometimes IEqualityComparer also implements IComparer
|
|
211
|
+
if (isComparer(comparer)) {
|
|
212
|
+
return new Comparer<T>((comparer as any as IComparer<T>).Compare);
|
|
213
|
+
} else {
|
|
214
|
+
return new Comparer<T>((x: T, y: T) => {
|
|
215
|
+
const xhash = comparer.GetHashCode(x);
|
|
216
|
+
const yhash = comparer.GetHashCode(y);
|
|
217
|
+
if (xhash === yhash) {
|
|
218
|
+
return comparer.Equals(x, y) ? 0 : -1;
|
|
219
|
+
} else {
|
|
220
|
+
return xhash < yhash ? -1 : 1;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function assertEqual<T>(actual: T, expected: T, msg?: string): void {
|
|
227
|
+
if (!equals(actual, expected)) {
|
|
228
|
+
throw Object.assign(new Error(msg || `Expected: ${expected} - Actual: ${actual}`), {
|
|
229
|
+
actual,
|
|
230
|
+
expected,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function assertNotEqual<T>(actual: T, expected: T, msg?: string): void {
|
|
236
|
+
if (equals(actual, expected)) {
|
|
237
|
+
throw Object.assign(new Error(msg || `Expected: ${expected} - Actual: ${actual}`), {
|
|
238
|
+
actual,
|
|
239
|
+
expected,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export class Lazy<T> {
|
|
245
|
+
private factory: () => T;
|
|
246
|
+
private isValueCreated: boolean;
|
|
247
|
+
|
|
248
|
+
private createdValue?: T;
|
|
249
|
+
|
|
250
|
+
constructor(factory: () => T) {
|
|
251
|
+
this.factory = factory;
|
|
252
|
+
this.isValueCreated = false;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
get Value() {
|
|
256
|
+
if (!this.isValueCreated) {
|
|
257
|
+
this.createdValue = this.factory();
|
|
258
|
+
this.isValueCreated = true;
|
|
259
|
+
}
|
|
260
|
+
return this.createdValue;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
get IsValueCreated() {
|
|
264
|
+
return this.isValueCreated;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function lazyFromValue<T>(v: T) {
|
|
269
|
+
return new Lazy(() => v);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function padWithZeros(i: number, length: number) {
|
|
273
|
+
let str = i.toString(10);
|
|
274
|
+
while (str.length < length) {
|
|
275
|
+
str = "0" + str;
|
|
276
|
+
}
|
|
277
|
+
return str;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export function padLeftAndRightWithZeros(i: number, lengthLeft: number, lengthRight: number) {
|
|
281
|
+
let str = i.toString(10);
|
|
282
|
+
while (str.length < lengthLeft) {
|
|
283
|
+
str = "0" + str;
|
|
284
|
+
}
|
|
285
|
+
while (str.length < lengthRight) {
|
|
286
|
+
str = str + "0";
|
|
287
|
+
}
|
|
288
|
+
return str;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function dateOffset(date: IDateTime | IDateTimeOffset): number {
|
|
292
|
+
const date1 = date as IDateTimeOffset;
|
|
293
|
+
return typeof date1.offset === "number"
|
|
294
|
+
? date1.offset
|
|
295
|
+
: ((date as IDateTime).kind === DateKind.UTC
|
|
296
|
+
? 0 : date.getTimezoneOffset() * -60000);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export function int16ToString(i: number, radix?: number) {
|
|
300
|
+
i = i < 0 && radix != null && radix !== 10 ? 0xFFFF + i + 1 : i;
|
|
301
|
+
return i.toString(radix);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export function int32ToString(i: number, radix?: number) {
|
|
305
|
+
i = i < 0 && radix != null && radix !== 10 ? 0xFFFFFFFF + i + 1 : i;
|
|
306
|
+
return i.toString(radix);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function int64ToString(i: bigint, radix?: number) {
|
|
310
|
+
i = i < 0 && radix != null && radix !== 10 ? 0xFFFFFFFFFFFFFFFFn + i + 1n : i;
|
|
311
|
+
return i.toString(radix);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export abstract class ObjectRef {
|
|
315
|
+
public static id(o: any) {
|
|
316
|
+
if (!ObjectRef.idMap.has(o)) {
|
|
317
|
+
ObjectRef.idMap.set(o, ++ObjectRef.count);
|
|
318
|
+
}
|
|
319
|
+
return ObjectRef.idMap.get(o);
|
|
320
|
+
}
|
|
321
|
+
private static idMap = new WeakMap();
|
|
322
|
+
private static count = 0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export function stringHash(s: string) {
|
|
326
|
+
let i = 0;
|
|
327
|
+
let h = 5381;
|
|
328
|
+
const len = s.length;
|
|
329
|
+
while (i < len) {
|
|
330
|
+
h = (h * 33) ^ s.charCodeAt(i++);
|
|
331
|
+
}
|
|
332
|
+
return h;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export function numberHash(x: number) {
|
|
336
|
+
return x * 2654435761 | 0;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
export function bigintHash(x: bigint) {
|
|
340
|
+
return stringHash(x.toString(32));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// From https://stackoverflow.com/a/37449594
|
|
344
|
+
export function combineHashCodes(hashes: ArrayLike<number>) {
|
|
345
|
+
let h1 = 0;
|
|
346
|
+
const len = hashes.length;
|
|
347
|
+
for (let i = 0; i < len; i++) {
|
|
348
|
+
const h2 = hashes[i];
|
|
349
|
+
h1 = ((h1 << 5) + h1) ^ h2;
|
|
350
|
+
}
|
|
351
|
+
return h1;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export function physicalHash<T>(x: T): number {
|
|
355
|
+
if (x == null) {
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
switch (typeof x) {
|
|
359
|
+
case "boolean":
|
|
360
|
+
return x ? 1 : 0;
|
|
361
|
+
case "number":
|
|
362
|
+
return numberHash(x);
|
|
363
|
+
case "bigint":
|
|
364
|
+
return bigintHash(x);
|
|
365
|
+
case "string":
|
|
366
|
+
return stringHash(x);
|
|
367
|
+
default:
|
|
368
|
+
return numberHash(ObjectRef.id(x));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
export function identityHash<T>(x: T): number {
|
|
373
|
+
if (isHashable(x)) {
|
|
374
|
+
return x.GetHashCode();
|
|
375
|
+
} else {
|
|
376
|
+
return physicalHash(x);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export function dateHash(x: Date): number {
|
|
381
|
+
return x.getTime();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export function arrayHash<T>(x: ArrayLike<T>): number {
|
|
385
|
+
const len = x.length;
|
|
386
|
+
const hashes: number[] = new Array(len);
|
|
387
|
+
for (let i = 0; i < len; i++) {
|
|
388
|
+
hashes[i] = structuralHash(x[i]);
|
|
389
|
+
}
|
|
390
|
+
return combineHashCodes(hashes);
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export function structuralHash<T>(x: T): number {
|
|
394
|
+
if (x == null) {
|
|
395
|
+
return 0;
|
|
396
|
+
}
|
|
397
|
+
switch (typeof x) {
|
|
398
|
+
case "boolean":
|
|
399
|
+
return x ? 1 : 0;
|
|
400
|
+
case "number":
|
|
401
|
+
return numberHash(x);
|
|
402
|
+
case "bigint":
|
|
403
|
+
return bigintHash(x);
|
|
404
|
+
case "string":
|
|
405
|
+
return stringHash(x);
|
|
406
|
+
default: {
|
|
407
|
+
if (isHashable(x)) {
|
|
408
|
+
return x.GetHashCode();
|
|
409
|
+
} else if (isArrayLike(x)) {
|
|
410
|
+
return arrayHash(x);
|
|
411
|
+
} else if (x instanceof Date) {
|
|
412
|
+
return dateHash(x);
|
|
413
|
+
} else if (Object.getPrototypeOf(x)?.constructor === Object) {
|
|
414
|
+
// TODO: check call-stack to prevent cyclic objects?
|
|
415
|
+
const hashes = Object.values(x).map((v) => structuralHash(v));
|
|
416
|
+
return combineHashCodes(hashes);
|
|
417
|
+
} else {
|
|
418
|
+
// Classes don't implement GetHashCode by default, but must use identity hashing
|
|
419
|
+
return numberHash(ObjectRef.id(x));
|
|
420
|
+
// return stringHash(String(x));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// Intended for custom numeric types, like long or decimal
|
|
427
|
+
export function fastStructuralHash<T>(x: T): number {
|
|
428
|
+
return stringHash(String(x));
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Intended for declared types that may or may not implement GetHashCode
|
|
432
|
+
export function safeHash<T>(x: T): number {
|
|
433
|
+
// return x == null ? 0 : isHashable(x) ? x.GetHashCode() : numberHash(ObjectRef.id(x));
|
|
434
|
+
return identityHash(x);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export function equalArraysWith<T>(x: ArrayLike<T>, y: ArrayLike<T>, eq: (x: T, y: T) => boolean): boolean {
|
|
438
|
+
if (x == null) { return y == null; }
|
|
439
|
+
if (y == null) { return false; }
|
|
440
|
+
if (x.length !== y.length) { return false; }
|
|
441
|
+
for (let i = 0; i < x.length; i++) {
|
|
442
|
+
if (!eq(x[i], y[i])) { return false; }
|
|
443
|
+
}
|
|
444
|
+
return true;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export function equalArrays<T>(x: ArrayLike<T>, y: ArrayLike<T>): boolean {
|
|
448
|
+
return equalArraysWith(x, y, equals);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function equalObjects(x: { [k: string]: any }, y: { [k: string]: any }): boolean {
|
|
452
|
+
const xKeys = Object.keys(x);
|
|
453
|
+
const yKeys = Object.keys(y);
|
|
454
|
+
if (xKeys.length !== yKeys.length) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
xKeys.sort();
|
|
458
|
+
yKeys.sort();
|
|
459
|
+
for (let i = 0; i < xKeys.length; i++) {
|
|
460
|
+
if (xKeys[i] !== yKeys[i] || !equals(x[xKeys[i]], y[yKeys[i]])) {
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export function physicalEquality<T>(x: T, y: T): boolean {
|
|
468
|
+
return x === y;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
export function equals<T>(x: T, y: T): boolean {
|
|
472
|
+
if (x === y) {
|
|
473
|
+
return true;
|
|
474
|
+
} else if (x == null) {
|
|
475
|
+
return y == null;
|
|
476
|
+
} else if (y == null) {
|
|
477
|
+
return false;
|
|
478
|
+
} else if (isEquatable(x)) {
|
|
479
|
+
return x.Equals(y);
|
|
480
|
+
} else if (isArrayLike(x)) {
|
|
481
|
+
return isArrayLike(y) && equalArrays(x, y);
|
|
482
|
+
} else if (typeof x !== "object") {
|
|
483
|
+
return false;
|
|
484
|
+
} else if (x instanceof Date) {
|
|
485
|
+
return (y instanceof Date) && compareDates(x, y) === 0;
|
|
486
|
+
} else {
|
|
487
|
+
return Object.getPrototypeOf(x)?.constructor === Object && equalObjects(x, y);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
export function compareDates(x: Date | IDateTime | IDateTimeOffset, y: Date | IDateTime | IDateTimeOffset) {
|
|
492
|
+
let xtime;
|
|
493
|
+
let ytime;
|
|
494
|
+
|
|
495
|
+
// DateTimeOffset and DateTime deals with equality differently.
|
|
496
|
+
if ("offset" in x && "offset" in y) {
|
|
497
|
+
xtime = x.getTime();
|
|
498
|
+
ytime = y.getTime();
|
|
499
|
+
} else {
|
|
500
|
+
xtime = x.getTime() + dateOffset(x);
|
|
501
|
+
ytime = y.getTime() + dateOffset(y);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return xtime === ytime ? 0 : (xtime < ytime ? -1 : 1);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export function comparePrimitives<T>(x: T, y: T): number {
|
|
508
|
+
return x === y ? 0 : (x < y ? -1 : 1);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
export function compareArraysWith<T>(x: ArrayLike<T>, y: ArrayLike<T>, comp: (x: T, y: T) => number): number {
|
|
512
|
+
if (x == null) { return y == null ? 0 : 1; }
|
|
513
|
+
if (y == null) { return -1; }
|
|
514
|
+
if (x.length !== y.length) {
|
|
515
|
+
return x.length < y.length ? -1 : 1;
|
|
516
|
+
}
|
|
517
|
+
for (let i = 0, j = 0; i < x.length; i++) {
|
|
518
|
+
j = comp(x[i], y[i]);
|
|
519
|
+
if (j !== 0) { return j; }
|
|
520
|
+
}
|
|
521
|
+
return 0;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export function compareArrays<T>(x: ArrayLike<T>, y: ArrayLike<T>): number {
|
|
525
|
+
return compareArraysWith(x, y, compare);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
function compareObjects(x: { [k: string]: any }, y: { [k: string]: any }): number {
|
|
529
|
+
const xKeys = Object.keys(x);
|
|
530
|
+
const yKeys = Object.keys(y);
|
|
531
|
+
if (xKeys.length !== yKeys.length) {
|
|
532
|
+
return xKeys.length < yKeys.length ? -1 : 1;
|
|
533
|
+
}
|
|
534
|
+
xKeys.sort();
|
|
535
|
+
yKeys.sort();
|
|
536
|
+
for (let i = 0, j = 0; i < xKeys.length; i++) {
|
|
537
|
+
const key = xKeys[i];
|
|
538
|
+
if (key !== yKeys[i]) {
|
|
539
|
+
return key < yKeys[i] ? -1 : 1;
|
|
540
|
+
} else {
|
|
541
|
+
j = compare(x[key], y[key]);
|
|
542
|
+
if (j !== 0) { return j; }
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
return 0;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
export function compare<T>(x: T, y: T): number {
|
|
549
|
+
if (x === y) {
|
|
550
|
+
return 0;
|
|
551
|
+
} else if (x == null) {
|
|
552
|
+
return y == null ? 0 : -1;
|
|
553
|
+
} else if (y == null) {
|
|
554
|
+
return 1;
|
|
555
|
+
} else if (isComparable(x)) {
|
|
556
|
+
return x.CompareTo(y);
|
|
557
|
+
} else if (isArrayLike(x)) {
|
|
558
|
+
return isArrayLike(y) ? compareArrays(x, y) : -1;
|
|
559
|
+
} else if (typeof x !== "object") {
|
|
560
|
+
return x < y ? -1 : 1;
|
|
561
|
+
} else if (x instanceof Date) {
|
|
562
|
+
return y instanceof Date ? compareDates(x, y) : -1;
|
|
563
|
+
} else {
|
|
564
|
+
return Object.getPrototypeOf(x)?.constructor === Object ? compareObjects(x, y) : -1;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export function min<T>(comparer: (x: T, y: T) => number, x: T, y: T) {
|
|
569
|
+
return comparer(x, y) < 0 ? x : y;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
export function max<T>(comparer: (x: T, y: T) => number, x: T, y: T) {
|
|
573
|
+
return comparer(x, y) > 0 ? x : y;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
export function clamp<T>(comparer: (x: T, y: T) => number, value: T, min: T, max: T) {
|
|
577
|
+
return (comparer(value, min) < 0) ? min : (comparer(value, max) > 0) ? max : value;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
export function createAtom<T>(value: T): (<Args extends [] | [T]>(...args: Args) => Args extends [] ? T : void) {
|
|
581
|
+
let atom = value;
|
|
582
|
+
return (...args) => {
|
|
583
|
+
if (args.length === 0) {
|
|
584
|
+
return atom as any;
|
|
585
|
+
} else {
|
|
586
|
+
atom = args[0];
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
export function createObj(fields: Iterable<[string, any]>) {
|
|
592
|
+
const obj: any = {};
|
|
593
|
+
for (const kv of fields) {
|
|
594
|
+
obj[kv[0]] = kv[1];
|
|
595
|
+
}
|
|
596
|
+
return obj;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
export function jsOptions(mutator: (x: object) => void): object {
|
|
600
|
+
const opts = {};
|
|
601
|
+
mutator(opts);
|
|
602
|
+
return opts;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
export function round(value: number, digits: number = 0) {
|
|
606
|
+
const m = Math.pow(10, digits);
|
|
607
|
+
const n = +(digits ? value * m : value).toFixed(8);
|
|
608
|
+
const i = Math.floor(n);
|
|
609
|
+
const f = n - i;
|
|
610
|
+
const e = 1e-8;
|
|
611
|
+
const r = (f > 0.5 - e && f < 0.5 + e) ? ((i % 2 === 0) ? i : i + 1) : Math.round(n);
|
|
612
|
+
return digits ? r / m : r;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
export function sign(x: number): number {
|
|
616
|
+
return x > 0 ? 1 : x < 0 ? -1 : 0;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export function unescapeDataString(s: string): string {
|
|
620
|
+
// https://stackoverflow.com/a/4458580/524236
|
|
621
|
+
return decodeURIComponent((s).replace(/\+/g, "%20"));
|
|
622
|
+
}
|
|
623
|
+
export function escapeDataString(s: string): string {
|
|
624
|
+
return encodeURIComponent(s).replace(/!/g, "%21")
|
|
625
|
+
.replace(/'/g, "%27")
|
|
626
|
+
.replace(/\(/g, "%28")
|
|
627
|
+
.replace(/\)/g, "%29")
|
|
628
|
+
.replace(/\*/g, "%2A");
|
|
629
|
+
}
|
|
630
|
+
export function escapeUriString(s: string): string {
|
|
631
|
+
return encodeURI(s);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// ICollection.Clear and Count members can be called on Arrays
|
|
635
|
+
// or Dictionaries so we need a runtime check (see #1120)
|
|
636
|
+
export function count<T>(col: Iterable<T>): number {
|
|
637
|
+
if (isArrayLike(col)) {
|
|
638
|
+
return col.length;
|
|
639
|
+
} else {
|
|
640
|
+
let count = 0;
|
|
641
|
+
for (const _ of col) {
|
|
642
|
+
count++;
|
|
643
|
+
}
|
|
644
|
+
return count;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
export function clear<T>(col: Iterable<T>) {
|
|
649
|
+
if (isArrayLike(col)) {
|
|
650
|
+
(col as any as T[]).splice(0);
|
|
651
|
+
} else {
|
|
652
|
+
(col as any).clear();
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const curried = new WeakMap<object, object>();
|
|
657
|
+
|
|
658
|
+
export function uncurry2<T1, T2, TResult>(f: (a1: T1) => (a2: T2) => TResult) {
|
|
659
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2) => TResult }
|
|
660
|
+
const f2 = (a1: T1, a2: T2) => f(a1)(a2);
|
|
661
|
+
curried.set(f2, f);
|
|
662
|
+
return f2;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
export function curry2<T1, T2, TResult>(f: (a1: T1, a2: T2) => TResult) {
|
|
666
|
+
return curried.get(f) as ((a1: T1) => (a2: T2) => TResult) ?? ((a1: T1) => (a2: T2) => f(a1, a2));
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
export function uncurry3<T1, T2, T3, TResult>(f: (a1: T1) => (a2: T2) => (a3: T3) => TResult) {
|
|
670
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3) => TResult }
|
|
671
|
+
const f2 = (a1: T1, a2: T2, a3: T3) => f(a1)(a2)(a3);
|
|
672
|
+
curried.set(f2, f);
|
|
673
|
+
return f2;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
export function curry3<T1, T2, T3, TResult>(f: (a1: T1, a2: T2, a3: T3) => TResult) {
|
|
677
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => TResult
|
|
678
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => f(a1, a2, a3));
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
export function uncurry4<T1, T2, T3, T4, TResult>(
|
|
682
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => TResult
|
|
683
|
+
) {
|
|
684
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4) => TResult }
|
|
685
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4) => f(a1)(a2)(a3)(a4);
|
|
686
|
+
curried.set(f2, f);
|
|
687
|
+
return f2;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
export function curry4<T1, T2, T3, T4, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4) => TResult) {
|
|
691
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => TResult
|
|
692
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => f(a1, a2, a3, a4));
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
export function uncurry5<T1, T2, T3, T4, T5, TResult>(
|
|
696
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => TResult
|
|
697
|
+
) {
|
|
698
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) => TResult }
|
|
699
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) => f(a1)(a2)(a3)(a4)(a5);
|
|
700
|
+
curried.set(f2, f);
|
|
701
|
+
return f2;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
export function curry5<T1, T2, T3, T4, T5, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) => TResult) {
|
|
705
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => TResult
|
|
706
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => f(a1, a2, a3, a4, a5));
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
export function uncurry6<T1, T2, T3, T4, T5, T6, TResult>(
|
|
710
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => TResult
|
|
711
|
+
) {
|
|
712
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) => TResult }
|
|
713
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) => f(a1)(a2)(a3)(a4)(a5)(a6);
|
|
714
|
+
curried.set(f2, f);
|
|
715
|
+
return f2;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
export function curry6<T1, T2, T3, T4, T5, T6, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) => TResult) {
|
|
719
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => TResult
|
|
720
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => f(a1, a2, a3, a4, a5, a6));
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
export function uncurry7<T1, T2, T3, T4, T5, T6, T7, TResult>(
|
|
724
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => TResult
|
|
725
|
+
) {
|
|
726
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) => TResult }
|
|
727
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7);
|
|
728
|
+
curried.set(f2, f);
|
|
729
|
+
return f2;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
export function curry7<T1, T2, T3, T4, T5, T6, T7, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) => TResult) {
|
|
733
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => TResult
|
|
734
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => f(a1, a2, a3, a4, a5, a6, a7));
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
export function uncurry8<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(
|
|
738
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => TResult
|
|
739
|
+
) {
|
|
740
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) => TResult }
|
|
741
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8);
|
|
742
|
+
curried.set(f2, f);
|
|
743
|
+
return f2;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
export function curry8<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) => TResult) {
|
|
747
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => TResult
|
|
748
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => f(a1, a2, a3, a4, a5, a6, a7, a8));
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
export function uncurry9<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(
|
|
752
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => TResult
|
|
753
|
+
) {
|
|
754
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) => TResult }
|
|
755
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9);
|
|
756
|
+
curried.set(f2, f);
|
|
757
|
+
return f2;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
export function curry9<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) => TResult) {
|
|
761
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => TResult
|
|
762
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9));
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export function uncurry10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>(
|
|
766
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => TResult
|
|
767
|
+
) {
|
|
768
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) => TResult }
|
|
769
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10);
|
|
770
|
+
curried.set(f2, f);
|
|
771
|
+
return f2;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
export function curry10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) => TResult) {
|
|
775
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => TResult
|
|
776
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10));
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
export function uncurry11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult>(
|
|
780
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => TResult
|
|
781
|
+
) {
|
|
782
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) => TResult }
|
|
783
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11);
|
|
784
|
+
curried.set(f2, f);
|
|
785
|
+
return f2;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
export function curry11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) => TResult) {
|
|
789
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => TResult
|
|
790
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11));
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
export function uncurry12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult>(
|
|
794
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => TResult
|
|
795
|
+
) {
|
|
796
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) => TResult }
|
|
797
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12);
|
|
798
|
+
curried.set(f2, f);
|
|
799
|
+
return f2;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export function curry12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) => TResult) {
|
|
803
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => TResult
|
|
804
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12));
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
export function uncurry13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult>(
|
|
808
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => TResult
|
|
809
|
+
) {
|
|
810
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) => TResult }
|
|
811
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13);
|
|
812
|
+
curried.set(f2, f);
|
|
813
|
+
return f2;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
export function curry13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) => TResult) {
|
|
817
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => TResult
|
|
818
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13));
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
export function uncurry14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>(
|
|
822
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => TResult
|
|
823
|
+
) {
|
|
824
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) => TResult }
|
|
825
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14);
|
|
826
|
+
curried.set(f2, f);
|
|
827
|
+
return f2;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
export function curry14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) => TResult) {
|
|
831
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => TResult
|
|
832
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14));
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
export function uncurry15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>(
|
|
836
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => TResult
|
|
837
|
+
) {
|
|
838
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) => TResult }
|
|
839
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15);
|
|
840
|
+
curried.set(f2, f);
|
|
841
|
+
return f2;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
export function curry15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) => TResult) {
|
|
845
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => TResult
|
|
846
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15));
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
export function uncurry16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>(
|
|
850
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => TResult
|
|
851
|
+
) {
|
|
852
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) => TResult }
|
|
853
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16);
|
|
854
|
+
curried.set(f2, f);
|
|
855
|
+
return f2;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
export function curry16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) => TResult) {
|
|
859
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => TResult
|
|
860
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16));
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
export function uncurry17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, TResult>(
|
|
864
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => TResult
|
|
865
|
+
) {
|
|
866
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) => TResult }
|
|
867
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17);
|
|
868
|
+
curried.set(f2, f);
|
|
869
|
+
return f2;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
export function curry17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) => TResult) {
|
|
873
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => TResult
|
|
874
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17));
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
export function uncurry18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, TResult>(
|
|
878
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => TResult
|
|
879
|
+
) {
|
|
880
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) => TResult }
|
|
881
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18);
|
|
882
|
+
curried.set(f2, f);
|
|
883
|
+
return f2;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
export function curry18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) => TResult) {
|
|
887
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => TResult
|
|
888
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18));
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
export function uncurry19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, TResult>(
|
|
892
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => TResult
|
|
893
|
+
) {
|
|
894
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) => TResult }
|
|
895
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19);
|
|
896
|
+
curried.set(f2, f);
|
|
897
|
+
return f2;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
export function curry19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) => TResult) {
|
|
901
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => TResult
|
|
902
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19));
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
export function uncurry20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, TResult>(
|
|
906
|
+
f: (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => (a20: T20) => TResult
|
|
907
|
+
) {
|
|
908
|
+
if (f == null) { return null as unknown as (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) => TResult }
|
|
909
|
+
const f2 = (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) => f(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)(a20);
|
|
910
|
+
curried.set(f2, f);
|
|
911
|
+
return f2;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
export function curry20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, TResult>(f: (a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) => TResult) {
|
|
915
|
+
return curried.get(f) as (a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => (a20: T20) => TResult
|
|
916
|
+
?? ((a1: T1) => (a2: T2) => (a3: T3) => (a4: T4) => (a5: T5) => (a6: T6) => (a7: T7) => (a8: T8) => (a9: T9) => (a10: T10) => (a11: T11) => (a12: T12) => (a13: T13) => (a14: T14) => (a15: T15) => (a16: T16) => (a17: T17) => (a18: T18) => (a19: T19) => (a20: T20) => f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20));
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// More performant method to copy arrays, see #2352
|
|
920
|
+
export function copyToArray<T>(source: T[], sourceIndex: number, target: T[], targetIndex: number, count: number): void {
|
|
921
|
+
if (ArrayBuffer.isView(source) && ArrayBuffer.isView(target)) {
|
|
922
|
+
(target as any).set((source as any).subarray(sourceIndex, sourceIndex + count), targetIndex);
|
|
923
|
+
} else {
|
|
924
|
+
for (let i = 0; i < count; ++i) {
|
|
925
|
+
target[targetIndex + i] = source[sourceIndex + i];
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|