@magnusopera/fscript 0.80.0 → 0.81.0

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.
@@ -0,0 +1,808 @@
1
+
2
+ import { Span, Position } from "./Span.js";
3
+ import { EvalException, EvalError$ } from "./Error.js";
4
+ import { tail as tail_1, head, isEmpty as isEmpty_1, iterate2, iterate as iterate_1, tryFind as tryFind_1, forAll2, length, forAll as forAll_1, contains, map, ofArray, append, empty as empty_1 } from "../fable_modules/fable-library-js.5.13.0/List.js";
5
+ import { Value, HostManagedValue, ExtensionRegistration } from "./Value.js";
6
+ import { typeDefs } from "./BuiltinTypes.js";
7
+ import { FSharpMap__get_Item, iterate, map as map_1, FSharpMap__get_Count, FSharpMap__TryFind, tryFind, forAll, FSharpMap__Add, containsKey, empty as empty_2 } from "../fable_modules/fable-library-js.5.13.0/Map.js";
8
+ import { curry2, stringHash, disposeSafe, getEnumerator, comparePrimitives } from "../fable_modules/fable-library-js.5.13.0/Util.js";
9
+ import { concat, isNullOrWhiteSpace } from "../fable_modules/fable-library-js.5.13.0/String.js";
10
+ import { Types_ftvType, Types_typeToString, Type } from "./Types.js";
11
+ import { exists } from "../fable_modules/fable-library-js.5.13.0/Seq.js";
12
+ import { value as value_4, toArray } from "../fable_modules/fable-library-js.5.13.0/Option.js";
13
+ import { minElement, isEmpty } from "../fable_modules/fable-library-js.5.13.0/Set.js";
14
+ import { min } from "../fable_modules/fable-library-js.5.13.0/Double.js";
15
+
16
+ const span = new Span(new Position(undefined, 0, 0), new Position(undefined, 0, 0));
17
+
18
+ function fail(message) {
19
+ throw new EvalException(new EvalError$(message, span));
20
+ }
21
+
22
+ export const empty = new ExtensionRegistration(empty_1(), empty_1());
23
+
24
+ export function ofExterns(functions) {
25
+ return new ExtensionRegistration(empty.Types, functions);
26
+ }
27
+
28
+ export function typeDefinitions(registration, scriptNames) {
29
+ const reserved = append(ofArray(["unit", "int", "float", "bool", "string", "numeric", "type"]), append(map((d) => d.Name, typeDefs), scriptNames));
30
+ let definitions = empty_2({
31
+ Compare: (x, y) => (comparePrimitives(x, y) | 0),
32
+ });
33
+ const enumerator = getEnumerator(registration.Types);
34
+ try {
35
+ while (enumerator["System.Collections.IEnumerator.MoveNext"]()) {
36
+ const descriptor = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]();
37
+ if (isNullOrWhiteSpace(descriptor.Name)) {
38
+ fail("Host type name must not be empty");
39
+ }
40
+ if (contains(descriptor.Name, reserved, {
41
+ Equals: (x_1, y_1) => (x_1 === y_1),
42
+ GetHashCode: (x_1) => (stringHash(x_1) | 0),
43
+ }) ? true : containsKey(descriptor.Name, definitions)) {
44
+ fail(concat("Host type name conflict: \'", descriptor.Name, "\'"));
45
+ }
46
+ definitions = FSharpMap__Add(definitions, descriptor.Name, descriptor.HostManaged ? (new Type(/* THostManaged */ 17, [descriptor.Name, descriptor.Fields])) : (new Type(/* TRecord */ 8, [descriptor.Fields])));
47
+ }
48
+ }
49
+ finally {
50
+ disposeSafe(enumerator);
51
+ }
52
+ return definitions;
53
+ }
54
+
55
+ export function matches(definitions_mut, expected_mut, value_mut) {
56
+ matches:
57
+ while (true) {
58
+ const definitions = definitions_mut, expected = expected_mut, value = value_mut;
59
+ const fieldsMatch = (fields, values) => forAll((name, fieldType) => exists((value_1) => matches(definitions, fieldType, value_1), toArray(tryFind(name, values))), fields);
60
+ let matchResult, name_1, fields_1, host, name_2, fields_2, values_1, constructible, fields_3, host_1, fields_4, values_2, t_1, values_3, ts, values_4, t_2, v, t_3, values_5, actualName, caseName, cases, name_3, payload;
61
+ switch (expected.tag) {
62
+ case 17: {
63
+ if (value.tag === 16) {
64
+ matchResult = 1;
65
+ fields_1 = expected.fields[1];
66
+ host = value.fields[0];
67
+ name_2 = expected.fields[0];
68
+ }
69
+ else {
70
+ matchResult = 16;
71
+ }
72
+ break;
73
+ }
74
+ case 8: {
75
+ if (value.tag === 7) {
76
+ matchResult = 2;
77
+ fields_2 = expected.fields[0];
78
+ values_1 = value.fields[0];
79
+ }
80
+ else {
81
+ matchResult = 16;
82
+ }
83
+ break;
84
+ }
85
+ case 18: {
86
+ switch (value.tag) {
87
+ case 16: {
88
+ matchResult = 3;
89
+ constructible = expected.fields[2];
90
+ fields_3 = expected.fields[1];
91
+ host_1 = value.fields[0];
92
+ break;
93
+ }
94
+ case 7: {
95
+ matchResult = 4;
96
+ fields_4 = expected.fields[1];
97
+ values_2 = value.fields[0];
98
+ break;
99
+ }
100
+ default:
101
+ matchResult = 16;
102
+ }
103
+ break;
104
+ }
105
+ case 0: {
106
+ if (value.tag === 0) {
107
+ matchResult = 5;
108
+ }
109
+ else {
110
+ matchResult = 16;
111
+ }
112
+ break;
113
+ }
114
+ case 1: {
115
+ if (value.tag === 1) {
116
+ matchResult = 5;
117
+ }
118
+ else {
119
+ matchResult = 16;
120
+ }
121
+ break;
122
+ }
123
+ case 2: {
124
+ if (value.tag === 2) {
125
+ matchResult = 5;
126
+ }
127
+ else {
128
+ matchResult = 16;
129
+ }
130
+ break;
131
+ }
132
+ case 3: {
133
+ if (value.tag === 3) {
134
+ matchResult = 5;
135
+ }
136
+ else {
137
+ matchResult = 16;
138
+ }
139
+ break;
140
+ }
141
+ case 4: {
142
+ if (value.tag === 4) {
143
+ matchResult = 5;
144
+ }
145
+ else {
146
+ matchResult = 16;
147
+ }
148
+ break;
149
+ }
150
+ case 5: {
151
+ if (value.tag === 5) {
152
+ matchResult = 6;
153
+ t_1 = expected.fields[0];
154
+ values_3 = value.fields[0];
155
+ }
156
+ else {
157
+ matchResult = 16;
158
+ }
159
+ break;
160
+ }
161
+ case 7: {
162
+ if (value.tag === 6) {
163
+ matchResult = 7;
164
+ ts = expected.fields[0];
165
+ values_4 = value.fields[0];
166
+ }
167
+ else {
168
+ matchResult = 16;
169
+ }
170
+ break;
171
+ }
172
+ case 10: {
173
+ if (value.tag === 9) {
174
+ if (value.fields[0] != null) {
175
+ matchResult = 9;
176
+ t_2 = expected.fields[0];
177
+ v = value.fields[0];
178
+ }
179
+ else {
180
+ matchResult = 8;
181
+ }
182
+ }
183
+ else {
184
+ matchResult = 16;
185
+ }
186
+ break;
187
+ }
188
+ case 9: {
189
+ if (value.tag === 8) {
190
+ matchResult = 10;
191
+ t_3 = expected.fields[1];
192
+ values_5 = value.fields[0];
193
+ }
194
+ else {
195
+ matchResult = 16;
196
+ }
197
+ break;
198
+ }
199
+ case 13: {
200
+ if (value.tag === 10) {
201
+ matchResult = 11;
202
+ actualName = value.fields[0];
203
+ caseName = value.fields[1];
204
+ cases = expected.fields[1];
205
+ name_3 = expected.fields[0];
206
+ payload = value.fields[2];
207
+ }
208
+ else {
209
+ matchResult = 16;
210
+ }
211
+ break;
212
+ }
213
+ case 6: {
214
+ if (value.tag === 13) {
215
+ matchResult = 12;
216
+ }
217
+ else {
218
+ matchResult = 16;
219
+ }
220
+ break;
221
+ }
222
+ case 14: {
223
+ if (value.tag === 12) {
224
+ matchResult = 12;
225
+ }
226
+ else {
227
+ matchResult = 16;
228
+ }
229
+ break;
230
+ }
231
+ case 11: {
232
+ switch (value.tag) {
233
+ case 14:
234
+ case 15:
235
+ case 11: {
236
+ matchResult = 13;
237
+ break;
238
+ }
239
+ default:
240
+ matchResult = 16;
241
+ }
242
+ break;
243
+ }
244
+ case 15: {
245
+ matchResult = 14;
246
+ break;
247
+ }
248
+ case 16: {
249
+ switch (value.tag) {
250
+ case 1:
251
+ case 2: {
252
+ matchResult = 15;
253
+ break;
254
+ }
255
+ default:
256
+ matchResult = 16;
257
+ }
258
+ break;
259
+ }
260
+ default: {
261
+ matchResult = 0;
262
+ name_1 = expected.fields[0];
263
+ }
264
+ }
265
+ switch (matchResult) {
266
+ case 0:
267
+ return exists((t) => matches(definitions, t, value), toArray(FSharpMap__TryFind(definitions, name_1)));
268
+ case 1:
269
+ if (((host.Descriptor.HostManaged && (host.Descriptor.Name === name_2)) && host.Descriptor.Fields.Equals(fields_1)) && (FSharpMap__get_Count(host.Fields) === FSharpMap__get_Count(fields_1))) {
270
+ return fieldsMatch(fields_1, host.Fields);
271
+ }
272
+ else {
273
+ return false;
274
+ }
275
+ case 2:
276
+ return fieldsMatch(fields_2, values_1);
277
+ case 3:
278
+ if (!constructible) {
279
+ return fieldsMatch(fields_3, host_1.Fields);
280
+ }
281
+ else {
282
+ return false;
283
+ }
284
+ case 4:
285
+ return fieldsMatch(fields_4, values_2);
286
+ case 5:
287
+ return true;
288
+ case 6:
289
+ return forAll_1((value_2) => matches(definitions, t_1, value_2), values_3);
290
+ case 7:
291
+ if (length(ts) === length(values_4)) {
292
+ return forAll2((expected_1, value_3) => matches(definitions, expected_1, value_3), ts, values_4);
293
+ }
294
+ else {
295
+ return false;
296
+ }
297
+ case 8:
298
+ return true;
299
+ case 9: {
300
+ definitions_mut = definitions;
301
+ expected_mut = t_2;
302
+ value_mut = v;
303
+ continue matches;
304
+ }
305
+ case 10:
306
+ return forAll((_arg, v_1) => matches(definitions, t_3, v_1), values_5);
307
+ case 11:
308
+ if (name_3 === actualName) {
309
+ const matchValue_1 = FSharpMap__TryFind(cases, caseName);
310
+ let matchResult_1, t_4, v_2;
311
+ if (matchValue_1 != null) {
312
+ if (value_4(matchValue_1) != null) {
313
+ if (payload != null) {
314
+ matchResult_1 = 1;
315
+ t_4 = value_4(matchValue_1);
316
+ v_2 = payload;
317
+ }
318
+ else {
319
+ matchResult_1 = 2;
320
+ }
321
+ }
322
+ else if (payload == null) {
323
+ matchResult_1 = 0;
324
+ }
325
+ else {
326
+ matchResult_1 = 2;
327
+ }
328
+ }
329
+ else {
330
+ matchResult_1 = 2;
331
+ }
332
+ switch (matchResult_1) {
333
+ case 0:
334
+ return true;
335
+ case 1: {
336
+ definitions_mut = definitions;
337
+ expected_mut = t_4;
338
+ value_mut = v_2;
339
+ continue matches;
340
+ }
341
+ default:
342
+ return false;
343
+ }
344
+ }
345
+ else {
346
+ return false;
347
+ }
348
+ case 12:
349
+ return true;
350
+ case 13:
351
+ return true;
352
+ case 14:
353
+ return true;
354
+ case 15:
355
+ return true;
356
+ default:
357
+ return false;
358
+ }
359
+ break;
360
+ }
361
+ }
362
+
363
+ export function validate(definitions, expected, value) {
364
+ if (!matches(definitions, expected, value)) {
365
+ fail(concat("Host value does not match ", Types_typeToString(expected)));
366
+ }
367
+ }
368
+
369
+ export function create(registration, typeName, fields, payload) {
370
+ const definitions = typeDefinitions(registration, empty_1());
371
+ const matchValue = tryFind_1((d) => {
372
+ if (d.Name === typeName) {
373
+ return d.HostManaged;
374
+ }
375
+ else {
376
+ return false;
377
+ }
378
+ }, registration.Types);
379
+ if (matchValue == null) {
380
+ return fail(concat("Unknown host-managed type \'", typeName, "\'"));
381
+ }
382
+ else {
383
+ const value = new Value(/* VHostManaged */ 16, [new HostManagedValue(matchValue, fields, payload)]);
384
+ validate(definitions, new Type(/* TNamed */ 12, [typeName]), value);
385
+ return value;
386
+ }
387
+ }
388
+
389
+ export function unwrap(typeName, value) {
390
+ let host;
391
+ let matchResult, host_1;
392
+ if (value.tag === 16) {
393
+ if ((host = value.fields[0], (host.Descriptor.Name === typeName) && host.Descriptor.HostManaged)) {
394
+ matchResult = 0;
395
+ host_1 = value.fields[0];
396
+ }
397
+ else {
398
+ matchResult = 1;
399
+ }
400
+ }
401
+ else {
402
+ matchResult = 1;
403
+ }
404
+ switch (matchResult) {
405
+ case 0:
406
+ return host_1;
407
+ default:
408
+ return fail(concat("Expected host-managed type \'", typeName, "\'"));
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Validate a call with one set of type-variable bindings, including polymorphic round trips.
414
+ */
415
+ export function validateCall(definitions, signature, arguments$, action) {
416
+ let bindings = empty_2({
417
+ Compare: (x, y) => (comparePrimitives(x, y) | 0),
418
+ });
419
+ const variables = Types_ftvType(signature);
420
+ let nextVariable = isEmpty(variables) ? -1 : min(-1, minElement(variables) - 1);
421
+ const fresh = () => {
422
+ const id = nextVariable | 0;
423
+ nextVariable = ((nextVariable - 1) | 0);
424
+ return new Type(/* TVar */ 15, [id]);
425
+ };
426
+ const valueType = (value) => {
427
+ switch (value.tag) {
428
+ case 1:
429
+ return Type.TInt;
430
+ case 2:
431
+ return Type.TFloat;
432
+ case 3:
433
+ return Type.TBool;
434
+ case 4:
435
+ return Type.TString;
436
+ case 16: {
437
+ const host = value.fields[0];
438
+ return new Type(/* THostManaged */ 17, [host.Descriptor.Name, host.Descriptor.Fields]);
439
+ }
440
+ case 5:
441
+ return new Type(/* TList */ 5, [fresh()]);
442
+ case 6:
443
+ return new Type(/* TTuple */ 7, [map((_arg) => fresh(), value.fields[0])]);
444
+ case 7:
445
+ return new Type(/* TRecord */ 8, [map_1((_arg_1, _arg_2) => fresh(), value.fields[0])]);
446
+ case 8:
447
+ return new Type(/* TMap */ 9, [fresh(), fresh()]);
448
+ case 9:
449
+ return new Type(/* TOption */ 10, [fresh()]);
450
+ case 10:
451
+ return new Type(/* TNamed */ 12, [value.fields[0]]);
452
+ case 12:
453
+ return Type.TTypeToken;
454
+ case 13:
455
+ return new Type(/* TTask */ 6, [fresh()]);
456
+ case 14:
457
+ case 15:
458
+ case 11:
459
+ return new Type(/* TFun */ 11, [fresh(), fresh()]);
460
+ default:
461
+ return Type.TUnit;
462
+ }
463
+ };
464
+ const observe = (expected_mut, value_1_mut) => {
465
+ observe:
466
+ while (true) {
467
+ const expected = expected_mut, value_1 = value_1_mut;
468
+ let registered;
469
+ const observeFields = (required, actual) => {
470
+ iterate((name_2, t) => {
471
+ observe(t, FSharpMap__get_Item(actual, name_2));
472
+ }, required);
473
+ };
474
+ let matchResult, id_1;
475
+ switch (expected.tag) {
476
+ case 15: {
477
+ matchResult = 0;
478
+ id_1 = expected.fields[0];
479
+ break;
480
+ }
481
+ case 16: {
482
+ matchResult = 0;
483
+ id_1 = expected.fields[0];
484
+ break;
485
+ }
486
+ case 12: {
487
+ matchResult = 1;
488
+ break;
489
+ }
490
+ case 18: {
491
+ matchResult = 2;
492
+ break;
493
+ }
494
+ default:
495
+ matchResult = 3;
496
+ }
497
+ switch (matchResult) {
498
+ case 0: {
499
+ const matchValue = FSharpMap__TryFind(bindings, id_1);
500
+ if (matchValue == null) {
501
+ validate(definitions, expected, value_1);
502
+ const bound_1 = valueType(value_1);
503
+ bindings = FSharpMap__Add(bindings, id_1, bound_1);
504
+ expected_mut = bound_1;
505
+ value_1_mut = value_1;
506
+ continue observe;
507
+ }
508
+ else {
509
+ expected_mut = matchValue;
510
+ value_1_mut = value_1;
511
+ continue observe;
512
+ }
513
+ break;
514
+ }
515
+ case 1: {
516
+ const matchValue_1 = tryFind(expected.fields[0], definitions);
517
+ if (matchValue_1 == null) {
518
+ validate(definitions, expected, value_1);
519
+ }
520
+ else {
521
+ expected_mut = matchValue_1;
522
+ value_1_mut = value_1;
523
+ continue observe;
524
+ }
525
+ break;
526
+ }
527
+ case 2: {
528
+ const id_2 = expected.fields[0] | 0;
529
+ const fields_1 = expected.fields[1];
530
+ validate(definitions, expected, value_1);
531
+ const matchValue_2 = FSharpMap__TryFind(bindings, id_2);
532
+ if (matchValue_2 == null) {
533
+ const bound_3 = valueType(value_1);
534
+ bindings = FSharpMap__Add(bindings, id_2, bound_3);
535
+ observe(bound_3, value_1);
536
+ }
537
+ else {
538
+ observe(matchValue_2, value_1);
539
+ }
540
+ let matchResult_1, host_2, actual_1;
541
+ switch (value_1.tag) {
542
+ case 16: {
543
+ if (!expected.fields[2]) {
544
+ matchResult_1 = 0;
545
+ host_2 = value_1.fields[0];
546
+ }
547
+ else {
548
+ matchResult_1 = 2;
549
+ }
550
+ break;
551
+ }
552
+ case 7: {
553
+ matchResult_1 = 1;
554
+ actual_1 = value_1.fields[0];
555
+ break;
556
+ }
557
+ default:
558
+ matchResult_1 = 2;
559
+ }
560
+ switch (matchResult_1) {
561
+ case 0: {
562
+ observeFields(fields_1, host_2.Fields);
563
+ break;
564
+ }
565
+ case 1: {
566
+ observeFields(fields_1, actual_1);
567
+ break;
568
+ }
569
+ case 2: {
570
+ validate(definitions, expected, value_1);
571
+ break;
572
+ }
573
+ }
574
+ break;
575
+ }
576
+ case 3: {
577
+ validate(definitions, expected, value_1);
578
+ let matchResult_2, fields_2, host_3, name_4, actual_2, fields_3, t_1, values_1, ts, values_2, inner, t_2, keyType, t_3, values_3, cases, inner_1, name_5;
579
+ switch (expected.tag) {
580
+ case 17: {
581
+ if (value_1.tag === 16) {
582
+ matchResult_2 = 0;
583
+ fields_2 = expected.fields[1];
584
+ host_3 = value_1.fields[0];
585
+ name_4 = expected.fields[0];
586
+ }
587
+ else {
588
+ matchResult_2 = 7;
589
+ }
590
+ break;
591
+ }
592
+ case 8: {
593
+ if (value_1.tag === 7) {
594
+ matchResult_2 = 1;
595
+ actual_2 = value_1.fields[0];
596
+ fields_3 = expected.fields[0];
597
+ }
598
+ else {
599
+ matchResult_2 = 7;
600
+ }
601
+ break;
602
+ }
603
+ case 5: {
604
+ if (value_1.tag === 5) {
605
+ matchResult_2 = 2;
606
+ t_1 = expected.fields[0];
607
+ values_1 = value_1.fields[0];
608
+ }
609
+ else {
610
+ matchResult_2 = 7;
611
+ }
612
+ break;
613
+ }
614
+ case 7: {
615
+ if (value_1.tag === 6) {
616
+ matchResult_2 = 3;
617
+ ts = expected.fields[0];
618
+ values_2 = value_1.fields[0];
619
+ }
620
+ else {
621
+ matchResult_2 = 7;
622
+ }
623
+ break;
624
+ }
625
+ case 10: {
626
+ if (value_1.tag === 9) {
627
+ if (value_1.fields[0] != null) {
628
+ matchResult_2 = 4;
629
+ inner = value_1.fields[0];
630
+ t_2 = expected.fields[0];
631
+ }
632
+ else {
633
+ matchResult_2 = 7;
634
+ }
635
+ }
636
+ else {
637
+ matchResult_2 = 7;
638
+ }
639
+ break;
640
+ }
641
+ case 9: {
642
+ if (value_1.tag === 8) {
643
+ matchResult_2 = 5;
644
+ keyType = expected.fields[0];
645
+ t_3 = expected.fields[1];
646
+ values_3 = value_1.fields[0];
647
+ }
648
+ else {
649
+ matchResult_2 = 7;
650
+ }
651
+ break;
652
+ }
653
+ case 13: {
654
+ if (value_1.tag === 10) {
655
+ if (value_1.fields[2] != null) {
656
+ matchResult_2 = 6;
657
+ cases = expected.fields[1];
658
+ inner_1 = value_1.fields[2];
659
+ name_5 = value_1.fields[1];
660
+ }
661
+ else {
662
+ matchResult_2 = 7;
663
+ }
664
+ }
665
+ else {
666
+ matchResult_2 = 7;
667
+ }
668
+ break;
669
+ }
670
+ default:
671
+ matchResult_2 = 7;
672
+ }
673
+ switch (matchResult_2) {
674
+ case 0: {
675
+ const matchValue_4 = tryFind(name_4, definitions);
676
+ let matchResult_3, registered_1;
677
+ if (matchValue_4 != null) {
678
+ if (matchValue_4.tag === 17) {
679
+ if ((registered = matchValue_4.fields[1], registered.Equals(fields_2))) {
680
+ matchResult_3 = 0;
681
+ registered_1 = matchValue_4.fields[1];
682
+ }
683
+ else {
684
+ matchResult_3 = 1;
685
+ }
686
+ }
687
+ else {
688
+ matchResult_3 = 1;
689
+ }
690
+ }
691
+ else {
692
+ matchResult_3 = 1;
693
+ }
694
+ switch (matchResult_3) {
695
+ case 1: {
696
+ fail(concat("Unregistered host-managed type \'", name_4, "\'"));
697
+ break;
698
+ }
699
+ }
700
+ observeFields(fields_2, host_3.Fields);
701
+ break;
702
+ }
703
+ case 1: {
704
+ observeFields(fields_3, actual_2);
705
+ break;
706
+ }
707
+ case 2: {
708
+ iterate_1(curry2(observe)(t_1), values_1);
709
+ break;
710
+ }
711
+ case 3: {
712
+ iterate2(observe, ts, values_2);
713
+ break;
714
+ }
715
+ case 4: {
716
+ expected_mut = t_2;
717
+ value_1_mut = inner;
718
+ continue observe;
719
+ break;
720
+ }
721
+ case 5: {
722
+ iterate((key_1, item) => {
723
+ let key;
724
+ observe(keyType, (key = key_1, (key.tag === 1) ? (new Value(/* VInt */ 1, [key.fields[0]])) : ((key.tag === 2) ? (new Value(/* VBool */ 3, [key.fields[0]])) : ((key.tag === 3) ? (new Value(/* VUnionCase */ 10, [key.fields[0], key.fields[1], undefined])) : (new Value(/* VString */ 4, [key.fields[0]]))))));
725
+ observe(t_3, item);
726
+ }, values_3);
727
+ break;
728
+ }
729
+ case 6: {
730
+ const option_1 = FSharpMap__get_Item(cases, name_5);
731
+ if (option_1 != null) {
732
+ expected_mut = option_1;
733
+ value_1_mut = inner_1;
734
+ continue observe;
735
+ }
736
+ break;
737
+ }
738
+ case 7: {
739
+ break;
740
+ }
741
+ }
742
+ break;
743
+ }
744
+ }
745
+ break;
746
+ }
747
+ };
748
+ const check = (remainingType_mut, remainingArguments_mut) => {
749
+ check:
750
+ while (true) {
751
+ const remainingType = remainingType_mut, remainingArguments = remainingArguments_mut;
752
+ let matchResult_4, argument, argumentType, resultType, tail, resultType_1;
753
+ if (remainingType.tag === 11) {
754
+ if (isEmpty_1(remainingArguments)) {
755
+ matchResult_4 = 1;
756
+ resultType_1 = remainingType;
757
+ }
758
+ else {
759
+ matchResult_4 = 0;
760
+ argument = head(remainingArguments);
761
+ argumentType = remainingType.fields[0];
762
+ resultType = remainingType.fields[1];
763
+ tail = tail_1(remainingArguments);
764
+ }
765
+ }
766
+ else if (isEmpty_1(remainingArguments)) {
767
+ matchResult_4 = 1;
768
+ resultType_1 = remainingType;
769
+ }
770
+ else {
771
+ matchResult_4 = 2;
772
+ }
773
+ switch (matchResult_4) {
774
+ case 0: {
775
+ observe(argumentType, argument);
776
+ remainingType_mut = resultType;
777
+ remainingArguments_mut = tail;
778
+ continue check;
779
+ }
780
+ case 1:
781
+ return resultType_1;
782
+ default:
783
+ return fail("Invalid argument count for host call");
784
+ }
785
+ break;
786
+ }
787
+ };
788
+ const resultType_2 = check(signature, arguments$);
789
+ const result = action();
790
+ observe(resultType_2, result);
791
+ return result;
792
+ }
793
+
794
+ export function invoke(definitions, externalFunction, context, arguments$) {
795
+ return validateCall(definitions, externalFunction.Scheme.fields[1], arguments$, () => externalFunction.Impl(context, arguments$));
796
+ }
797
+
798
+ export function $007CRecordFields$007C_$007C(value) {
799
+ switch (value.tag) {
800
+ case 7:
801
+ return value.fields[0];
802
+ case 16:
803
+ return value.fields[0].Fields;
804
+ default:
805
+ return undefined;
806
+ }
807
+ }
808
+