github.com/joomcode/cue@v0.4.4-0.20221111115225-539fe3512047/cue/testdata/disjunctions/elimination.txtar (about) 1 // Ensure that disjunction elimination is not done prematurely. 2 3 // Issue #651 4 5 -- in.cue -- 6 import "struct" 7 8 // Closedness checks should not be triggered too early, or with an improper 9 // subset of StructInfos. Blindly finalizing partial disjuncts will end up 10 // doing a closedness check with not all embeddings present, which can lead to 11 // a field being rejected prematurely. 12 // 13 // It should be recursively disabled. 14 disambiguateClosed: { 15 b: #Def & a 16 a: #Def 17 #Def: {{x: true} | {y: true}} 18 } 19 20 // Checks should never be disabled for field matching. 21 alwaysCheckMatchers1: { 22 b: {[=~"^xxxx$"]: int} | null 23 b: {c: string} | null 24 b: c: "yyyyy" 25 } 26 27 alwaysCheckPatterns2: { 28 a: #X 29 a: b 30 31 b: #X 32 b: c: "yyyyy" 33 34 #X: string | { 35 c: string 36 {[=~"^xxxx$"]: int} 37 } 38 } 39 40 nestedNonMonotonic: resolved: n1: { 41 x: {a: struct.MinFields(2)} | null 42 x: {a: c: 1} | null 43 x: {a: d: 1} | null 44 } 45 46 nestedNonMonotonic: resolved: n2: { 47 x: {a: b: struct.MinFields(2)} | null 48 x: {a: b: c: 1} | null 49 x: {a: b: d: 1} | null 50 } 51 52 nestedNonMonotonic: eliminated: n1: p1: { 53 x: {a: struct.MaxFields(1)} | null 54 x: {a: c: 1} | null 55 x: {a: d: 1} | null 56 } 57 58 nestedNonMonotonic: eliminated: n1: p2: { 59 x: {a: c: 1} | null 60 x: {a: struct.MaxFields(1)} | null 61 x: {a: d: 1} | null 62 } 63 64 nestedNonMonotonic: eliminated: n1: p2: { 65 x: {a: c: 1} | null 66 x: {a: d: 1} | null 67 x: {a: struct.MaxFields(1)} | null 68 } 69 70 nestedNonMonotonic: eliminated: n2: p1: { 71 x: {a: b: struct.MaxFields(1)} | null 72 x: {a: b: c: 1} | null 73 x: {a: b: d: 1} | null 74 } 75 76 nestedNonMonotonic: eliminated: n2: p2: { 77 x: {a: b: c: 1} | null 78 x: {a: b: struct.MaxFields(1)} | null 79 x: {a: b: d: 1} | null 80 } 81 82 nestedNonMonotonic: eliminated: n2: p2: { 83 x: {a: b: c: 1} | null 84 x: {a: b: d: 1} | null 85 x: {a: b: struct.MaxFields(1)} | null 86 } 87 88 nestedNonMonotonic: incomplete: a: n1: p1: { 89 x: {a: struct.MinFields(2)} | null 90 x: {a: c: 1} | null 91 } 92 93 nestedNonMonotonic: incomplete: a: n1: p2: { 94 x: {a: c: 1} | null 95 x: {a: struct.MinFields(2)} | null 96 } 97 98 nestedNonMonotonic: incomplete: a: n2: p1: { 99 x: {a: b: struct.MinFields(2)} | null 100 x: {a: b: c: 1} | null 101 } 102 103 nestedNonMonotonic: incomplete: a: n2: p2: { 104 x: {a: b: c: 1} | null 105 x: {a: b: struct.MinFields(2)} | null 106 } 107 108 nestedNonMonotonic: incomplete: b: n1: p1: { 109 x: {a: struct.MinFields(3)} | null 110 x: {a: c: 1} | null 111 x: {a: d: 1} | null 112 } 113 114 nestedNonMonotonic: incomplete: b: n1: p2: { 115 x: {a: c: 1} | null 116 x: {a: struct.MinFields(3)} | null 117 x: {a: d: 1} | null 118 } 119 120 nestedNonMonotonic: incomplete: b: n1: p3: { 121 x: {a: c: 1} | null 122 x: {a: d: 1} | null 123 x: {a: struct.MinFields(3)} | null 124 } 125 126 nestedNonMonotonic: incomplete: b: n2: p1: { 127 x: {a: b: struct.MinFields(3)} | null 128 x: {a: b: c: 1} | null 129 x: {a: b: d: 1} | null 130 } 131 132 nestedNonMonotonic: incomplete: b: n2: p1: { 133 x: {a: b: c: 1} | null 134 x: {a: b: struct.MinFields(3)} | null 135 x: {a: b: d: 1} | null 136 } 137 138 nestedNonMonotonic: incomplete: b: n2: p1: { 139 x: {a: b: c: 1} | null 140 x: {a: b: d: 1} | null 141 x: {a: b: struct.MinFields(3)} | null 142 } 143 144 preserveClosedness: small: p1: { 145 #A: #B & {a: string} 146 #B: { 147 *{} | {a: string} 148 *{} | {b: int} 149 } 150 } 151 152 preserveClosedness: small: p2: { 153 #A: #B & {a: string} 154 #B: { 155 {a: string} | *{} 156 *{} | {b: int} 157 } 158 } 159 160 preserveClosedness: medium: p1: { 161 #A: #B & {a: string} 162 #B: { 163 *{} | {a: string} | {b: string} 164 *{} | {c: int} | {d: string} 165 } 166 } 167 168 preserveClosedness: medium: p2: { 169 #A: #B & {a: string} 170 #B: { 171 {a: string} | *{} | {b: string} 172 *{} | {c: int} | {d: string} 173 } 174 } 175 176 preserveClosedness: medium: p3: { 177 #A: #B & {a: string} 178 #B: { 179 {a: string} | {b: string} | *{} 180 *{} | {c: int} | {d: string} 181 } 182 } 183 -- out/eval -- 184 (struct){ 185 disambiguateClosed: (struct){ 186 b: (#struct){ |((#struct){ 187 x: (bool){ true } 188 }, (#struct){ 189 y: (bool){ true } 190 }) } 191 a: (#struct){ |((#struct){ 192 x: (bool){ true } 193 }, (#struct){ 194 y: (bool){ true } 195 }) } 196 #Def: (#struct){ |((#struct){ 197 x: (bool){ true } 198 }, (#struct){ 199 y: (bool){ true } 200 }) } 201 } 202 alwaysCheckMatchers1: (struct){ 203 b: (struct){ 204 c: (string){ "yyyyy" } 205 } 206 } 207 alwaysCheckPatterns2: (struct){ 208 a: (#struct){ 209 c: (string){ "yyyyy" } 210 } 211 b: (#struct){ 212 c: (string){ "yyyyy" } 213 } 214 #X: ((string|struct)){ |((string){ string }, (#struct){ 215 c: (string){ string } 216 }) } 217 } 218 nestedNonMonotonic: (struct){ 219 resolved: (struct){ 220 n1: (struct){ 221 x: ((null|struct)){ |((struct){ 222 a: (struct){ 223 c: (int){ 1 } 224 d: (int){ 1 } 225 } 226 }, (null){ null }) } 227 } 228 n2: (struct){ 229 x: ((null|struct)){ |((struct){ 230 a: (struct){ 231 b: (struct){ 232 c: (int){ 1 } 233 d: (int){ 1 } 234 } 235 } 236 }, (null){ null }) } 237 } 238 } 239 eliminated: (struct){ 240 n1: (struct){ 241 p1: (struct){ 242 x: (null){ null } 243 } 244 p2: (struct){ 245 x: (null){ null } 246 } 247 } 248 n2: (struct){ 249 p1: (struct){ 250 x: (null){ null } 251 } 252 p2: (struct){ 253 x: (null){ null } 254 } 255 } 256 } 257 incomplete: (struct){ 258 a: (struct){ 259 n1: (struct){ 260 p1: (struct){ 261 x: ((null|struct)){ |((struct){ 262 a: (_|_){ 263 // [incomplete] nestedNonMonotonic.incomplete.a.n1.p1.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): 264 // ./in.cue:84:12 265 // ./in.cue:84:29 266 // ./in.cue:85:9 267 c: (int){ 1 } 268 } 269 }, (null){ null }) } 270 } 271 p2: (struct){ 272 x: ((null|struct)){ |((struct){ 273 a: (_|_){ 274 // [incomplete] nestedNonMonotonic.incomplete.a.n1.p2.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): 275 // ./in.cue:90:12 276 // ./in.cue:89:9 277 // ./in.cue:90:29 278 c: (int){ 1 } 279 } 280 }, (null){ null }) } 281 } 282 } 283 n2: (struct){ 284 p1: (struct){ 285 x: ((null|struct)){ |((struct){ 286 a: (struct){ 287 b: (_|_){ 288 // [incomplete] nestedNonMonotonic.incomplete.a.n2.p1.x.a.b: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): 289 // ./in.cue:94:15 290 // ./in.cue:94:32 291 // ./in.cue:95:12 292 c: (int){ 1 } 293 } 294 } 295 }, (null){ null }) } 296 } 297 p2: (struct){ 298 x: ((null|struct)){ |((struct){ 299 a: (struct){ 300 b: (_|_){ 301 // [incomplete] nestedNonMonotonic.incomplete.a.n2.p2.x.a.b: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): 302 // ./in.cue:100:15 303 // ./in.cue:99:12 304 // ./in.cue:100:32 305 c: (int){ 1 } 306 } 307 } 308 }, (null){ null }) } 309 } 310 } 311 } 312 b: (struct){ 313 n1: (struct){ 314 p1: (struct){ 315 x: ((null|struct)){ |((struct){ 316 a: (_|_){ 317 // [incomplete] nestedNonMonotonic.incomplete.b.n1.p1.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3): 318 // ./in.cue:104:12 319 // ./in.cue:104:29 320 // ./in.cue:105:9 321 // ./in.cue:106:9 322 c: (int){ 1 } 323 d: (int){ 1 } 324 } 325 }, (null){ null }) } 326 } 327 p2: (struct){ 328 x: ((null|struct)){ |((struct){ 329 a: (_|_){ 330 // [incomplete] nestedNonMonotonic.incomplete.b.n1.p2.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3): 331 // ./in.cue:111:12 332 // ./in.cue:110:9 333 // ./in.cue:111:29 334 // ./in.cue:112:9 335 c: (int){ 1 } 336 d: (int){ 1 } 337 } 338 }, (null){ null }) } 339 } 340 p3: (struct){ 341 x: ((null|struct)){ |((struct){ 342 a: (_|_){ 343 // [incomplete] nestedNonMonotonic.incomplete.b.n1.p3.x.a: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3): 344 // ./in.cue:118:12 345 // ./in.cue:116:9 346 // ./in.cue:117:9 347 // ./in.cue:118:29 348 c: (int){ 1 } 349 d: (int){ 1 } 350 } 351 }, (null){ null }) } 352 } 353 } 354 n2: (struct){ 355 p1: (struct){ 356 x: ((null|struct)){ |((struct){ 357 a: (struct){ 358 b: (_|_){ 359 // [incomplete] nestedNonMonotonic.incomplete.b.n2.p1.x.a.b: invalid value {c:1,d:1} (does not satisfy struct.MinFields(3)): len(fields) < MinFields(3) (2 < 3): 360 // ./in.cue:136:15 361 // ./in.cue:122:15 362 // ./in.cue:123:12 363 // ./in.cue:124:12 364 // ./in.cue:128:12 365 // ./in.cue:129:15 366 // ./in.cue:130:12 367 // ./in.cue:134:12 368 // ./in.cue:135:12 369 // ./in.cue:136:32 370 c: (int){ 1 } 371 d: (int){ 1 } 372 } 373 } 374 }, (null){ null }) } 375 } 376 } 377 } 378 } 379 } 380 preserveClosedness: (struct){ 381 small: (struct){ 382 p1: (struct){ 383 #A: (#struct){ |(*(#struct){ 384 a: (string){ string } 385 }, (#struct){ 386 a: (string){ string } 387 b: (int){ int } 388 }) } 389 #B: (#struct){ |(*(#struct){ 390 }, (#struct){ 391 b: (int){ int } 392 }, (#struct){ 393 a: (string){ string } 394 }, (#struct){ 395 a: (string){ string } 396 b: (int){ int } 397 }) } 398 } 399 p2: (struct){ 400 #A: (#struct){ |(*(#struct){ 401 a: (string){ string } 402 }, (#struct){ 403 a: (string){ string } 404 b: (int){ int } 405 }) } 406 #B: (#struct){ |(*(#struct){ 407 }, (#struct){ 408 a: (string){ string } 409 b: (int){ int } 410 }, (#struct){ 411 a: (string){ string } 412 }, (#struct){ 413 b: (int){ int } 414 }) } 415 } 416 } 417 medium: (struct){ 418 p1: (struct){ 419 #A: (#struct){ |(*(#struct){ 420 a: (string){ string } 421 }, (#struct){ 422 a: (string){ string } 423 c: (int){ int } 424 }, (#struct){ 425 a: (string){ string } 426 d: (string){ string } 427 }) } 428 #B: (#struct){ |(*(#struct){ 429 }, (#struct){ 430 c: (int){ int } 431 }, (#struct){ 432 d: (string){ string } 433 }, (#struct){ 434 a: (string){ string } 435 }, (#struct){ 436 a: (string){ string } 437 c: (int){ int } 438 }, (#struct){ 439 a: (string){ string } 440 d: (string){ string } 441 }, (#struct){ 442 b: (string){ string } 443 }, (#struct){ 444 b: (string){ string } 445 c: (int){ int } 446 }, (#struct){ 447 b: (string){ string } 448 d: (string){ string } 449 }) } 450 } 451 p2: (struct){ 452 #A: (#struct){ |(*(#struct){ 453 a: (string){ string } 454 }, (#struct){ 455 a: (string){ string } 456 c: (int){ int } 457 }, (#struct){ 458 a: (string){ string } 459 d: (string){ string } 460 }) } 461 #B: (#struct){ |(*(#struct){ 462 }, (#struct){ 463 a: (string){ string } 464 c: (int){ int } 465 }, (#struct){ 466 a: (string){ string } 467 d: (string){ string } 468 }, (#struct){ 469 a: (string){ string } 470 }, (#struct){ 471 c: (int){ int } 472 }, (#struct){ 473 d: (string){ string } 474 }, (#struct){ 475 b: (string){ string } 476 }, (#struct){ 477 b: (string){ string } 478 c: (int){ int } 479 }, (#struct){ 480 b: (string){ string } 481 d: (string){ string } 482 }) } 483 } 484 p3: (struct){ 485 #A: (#struct){ |(*(#struct){ 486 a: (string){ string } 487 }, (#struct){ 488 a: (string){ string } 489 c: (int){ int } 490 }, (#struct){ 491 a: (string){ string } 492 d: (string){ string } 493 }) } 494 #B: (#struct){ |(*(#struct){ 495 }, (#struct){ 496 a: (string){ string } 497 c: (int){ int } 498 }, (#struct){ 499 a: (string){ string } 500 d: (string){ string } 501 }, (#struct){ 502 b: (string){ string } 503 }, (#struct){ 504 b: (string){ string } 505 c: (int){ int } 506 }, (#struct){ 507 b: (string){ string } 508 d: (string){ string } 509 }, (#struct){ 510 a: (string){ string } 511 }, (#struct){ 512 c: (int){ int } 513 }, (#struct){ 514 d: (string){ string } 515 }) } 516 } 517 } 518 } 519 } 520 -- out/compile -- 521 --- in.cue 522 { 523 disambiguateClosed: { 524 b: (〈0;#Def〉 & 〈0;a〉) 525 a: 〈0;#Def〉 526 #Def: { 527 ({ 528 x: true 529 }|{ 530 y: true 531 }) 532 } 533 } 534 alwaysCheckMatchers1: { 535 b: ({ 536 [=~"^xxxx$"]: int 537 }|null) 538 b: ({ 539 c: string 540 }|null) 541 b: { 542 c: "yyyyy" 543 } 544 } 545 alwaysCheckPatterns2: { 546 a: 〈0;#X〉 547 a: 〈0;b〉 548 b: 〈0;#X〉 549 b: { 550 c: "yyyyy" 551 } 552 #X: (string|{ 553 c: string 554 { 555 [=~"^xxxx$"]: int 556 } 557 }) 558 } 559 nestedNonMonotonic: { 560 resolved: { 561 n1: { 562 x: ({ 563 a: 〈import;struct〉.MinFields(2) 564 }|null) 565 x: ({ 566 a: { 567 c: 1 568 } 569 }|null) 570 x: ({ 571 a: { 572 d: 1 573 } 574 }|null) 575 } 576 } 577 } 578 nestedNonMonotonic: { 579 resolved: { 580 n2: { 581 x: ({ 582 a: { 583 b: 〈import;struct〉.MinFields(2) 584 } 585 }|null) 586 x: ({ 587 a: { 588 b: { 589 c: 1 590 } 591 } 592 }|null) 593 x: ({ 594 a: { 595 b: { 596 d: 1 597 } 598 } 599 }|null) 600 } 601 } 602 } 603 nestedNonMonotonic: { 604 eliminated: { 605 n1: { 606 p1: { 607 x: ({ 608 a: 〈import;struct〉.MaxFields(1) 609 }|null) 610 x: ({ 611 a: { 612 c: 1 613 } 614 }|null) 615 x: ({ 616 a: { 617 d: 1 618 } 619 }|null) 620 } 621 } 622 } 623 } 624 nestedNonMonotonic: { 625 eliminated: { 626 n1: { 627 p2: { 628 x: ({ 629 a: { 630 c: 1 631 } 632 }|null) 633 x: ({ 634 a: 〈import;struct〉.MaxFields(1) 635 }|null) 636 x: ({ 637 a: { 638 d: 1 639 } 640 }|null) 641 } 642 } 643 } 644 } 645 nestedNonMonotonic: { 646 eliminated: { 647 n1: { 648 p2: { 649 x: ({ 650 a: { 651 c: 1 652 } 653 }|null) 654 x: ({ 655 a: { 656 d: 1 657 } 658 }|null) 659 x: ({ 660 a: 〈import;struct〉.MaxFields(1) 661 }|null) 662 } 663 } 664 } 665 } 666 nestedNonMonotonic: { 667 eliminated: { 668 n2: { 669 p1: { 670 x: ({ 671 a: { 672 b: 〈import;struct〉.MaxFields(1) 673 } 674 }|null) 675 x: ({ 676 a: { 677 b: { 678 c: 1 679 } 680 } 681 }|null) 682 x: ({ 683 a: { 684 b: { 685 d: 1 686 } 687 } 688 }|null) 689 } 690 } 691 } 692 } 693 nestedNonMonotonic: { 694 eliminated: { 695 n2: { 696 p2: { 697 x: ({ 698 a: { 699 b: { 700 c: 1 701 } 702 } 703 }|null) 704 x: ({ 705 a: { 706 b: 〈import;struct〉.MaxFields(1) 707 } 708 }|null) 709 x: ({ 710 a: { 711 b: { 712 d: 1 713 } 714 } 715 }|null) 716 } 717 } 718 } 719 } 720 nestedNonMonotonic: { 721 eliminated: { 722 n2: { 723 p2: { 724 x: ({ 725 a: { 726 b: { 727 c: 1 728 } 729 } 730 }|null) 731 x: ({ 732 a: { 733 b: { 734 d: 1 735 } 736 } 737 }|null) 738 x: ({ 739 a: { 740 b: 〈import;struct〉.MaxFields(1) 741 } 742 }|null) 743 } 744 } 745 } 746 } 747 nestedNonMonotonic: { 748 incomplete: { 749 a: { 750 n1: { 751 p1: { 752 x: ({ 753 a: 〈import;struct〉.MinFields(2) 754 }|null) 755 x: ({ 756 a: { 757 c: 1 758 } 759 }|null) 760 } 761 } 762 } 763 } 764 } 765 nestedNonMonotonic: { 766 incomplete: { 767 a: { 768 n1: { 769 p2: { 770 x: ({ 771 a: { 772 c: 1 773 } 774 }|null) 775 x: ({ 776 a: 〈import;struct〉.MinFields(2) 777 }|null) 778 } 779 } 780 } 781 } 782 } 783 nestedNonMonotonic: { 784 incomplete: { 785 a: { 786 n2: { 787 p1: { 788 x: ({ 789 a: { 790 b: 〈import;struct〉.MinFields(2) 791 } 792 }|null) 793 x: ({ 794 a: { 795 b: { 796 c: 1 797 } 798 } 799 }|null) 800 } 801 } 802 } 803 } 804 } 805 nestedNonMonotonic: { 806 incomplete: { 807 a: { 808 n2: { 809 p2: { 810 x: ({ 811 a: { 812 b: { 813 c: 1 814 } 815 } 816 }|null) 817 x: ({ 818 a: { 819 b: 〈import;struct〉.MinFields(2) 820 } 821 }|null) 822 } 823 } 824 } 825 } 826 } 827 nestedNonMonotonic: { 828 incomplete: { 829 b: { 830 n1: { 831 p1: { 832 x: ({ 833 a: 〈import;struct〉.MinFields(3) 834 }|null) 835 x: ({ 836 a: { 837 c: 1 838 } 839 }|null) 840 x: ({ 841 a: { 842 d: 1 843 } 844 }|null) 845 } 846 } 847 } 848 } 849 } 850 nestedNonMonotonic: { 851 incomplete: { 852 b: { 853 n1: { 854 p2: { 855 x: ({ 856 a: { 857 c: 1 858 } 859 }|null) 860 x: ({ 861 a: 〈import;struct〉.MinFields(3) 862 }|null) 863 x: ({ 864 a: { 865 d: 1 866 } 867 }|null) 868 } 869 } 870 } 871 } 872 } 873 nestedNonMonotonic: { 874 incomplete: { 875 b: { 876 n1: { 877 p3: { 878 x: ({ 879 a: { 880 c: 1 881 } 882 }|null) 883 x: ({ 884 a: { 885 d: 1 886 } 887 }|null) 888 x: ({ 889 a: 〈import;struct〉.MinFields(3) 890 }|null) 891 } 892 } 893 } 894 } 895 } 896 nestedNonMonotonic: { 897 incomplete: { 898 b: { 899 n2: { 900 p1: { 901 x: ({ 902 a: { 903 b: 〈import;struct〉.MinFields(3) 904 } 905 }|null) 906 x: ({ 907 a: { 908 b: { 909 c: 1 910 } 911 } 912 }|null) 913 x: ({ 914 a: { 915 b: { 916 d: 1 917 } 918 } 919 }|null) 920 } 921 } 922 } 923 } 924 } 925 nestedNonMonotonic: { 926 incomplete: { 927 b: { 928 n2: { 929 p1: { 930 x: ({ 931 a: { 932 b: { 933 c: 1 934 } 935 } 936 }|null) 937 x: ({ 938 a: { 939 b: 〈import;struct〉.MinFields(3) 940 } 941 }|null) 942 x: ({ 943 a: { 944 b: { 945 d: 1 946 } 947 } 948 }|null) 949 } 950 } 951 } 952 } 953 } 954 nestedNonMonotonic: { 955 incomplete: { 956 b: { 957 n2: { 958 p1: { 959 x: ({ 960 a: { 961 b: { 962 c: 1 963 } 964 } 965 }|null) 966 x: ({ 967 a: { 968 b: { 969 d: 1 970 } 971 } 972 }|null) 973 x: ({ 974 a: { 975 b: 〈import;struct〉.MinFields(3) 976 } 977 }|null) 978 } 979 } 980 } 981 } 982 } 983 preserveClosedness: { 984 small: { 985 p1: { 986 #A: (〈0;#B〉 & { 987 a: string 988 }) 989 #B: { 990 (*{}|{ 991 a: string 992 }) 993 (*{}|{ 994 b: int 995 }) 996 } 997 } 998 } 999 } 1000 preserveClosedness: { 1001 small: { 1002 p2: { 1003 #A: (〈0;#B〉 & { 1004 a: string 1005 }) 1006 #B: { 1007 ({ 1008 a: string 1009 }|*{}) 1010 (*{}|{ 1011 b: int 1012 }) 1013 } 1014 } 1015 } 1016 } 1017 preserveClosedness: { 1018 medium: { 1019 p1: { 1020 #A: (〈0;#B〉 & { 1021 a: string 1022 }) 1023 #B: { 1024 (*{}|{ 1025 a: string 1026 }|{ 1027 b: string 1028 }) 1029 (*{}|{ 1030 c: int 1031 }|{ 1032 d: string 1033 }) 1034 } 1035 } 1036 } 1037 } 1038 preserveClosedness: { 1039 medium: { 1040 p2: { 1041 #A: (〈0;#B〉 & { 1042 a: string 1043 }) 1044 #B: { 1045 ({ 1046 a: string 1047 }|*{}|{ 1048 b: string 1049 }) 1050 (*{}|{ 1051 c: int 1052 }|{ 1053 d: string 1054 }) 1055 } 1056 } 1057 } 1058 } 1059 preserveClosedness: { 1060 medium: { 1061 p3: { 1062 #A: (〈0;#B〉 & { 1063 a: string 1064 }) 1065 #B: { 1066 ({ 1067 a: string 1068 }|{ 1069 b: string 1070 }|*{}) 1071 (*{}|{ 1072 c: int 1073 }|{ 1074 d: string 1075 }) 1076 } 1077 } 1078 } 1079 } 1080 }