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