| // Ensure that disjunction elimination is not done prematurely. |
| |
| // Issue #651 |
| |
| -- in.cue -- |
| import "struct" |
| |
| // Closedness checks should not be triggered too early, or with an improper |
| // subset of StructInfos. Blindly finalizing partial disjuncts will end up |
| // doing a closedness check with not all embeddings present, which can lead to |
| // a field being rejected prematurely. |
| // |
| // It should be recursively disabled. |
| disambiguateClosed: { |
| b: #Def & a |
| a: #Def |
| #Def: { {x: true} | {y: true} } |
| } |
| |
| // Checks should never be disabled for field matching. |
| alwaysCheckMatchers1: { |
| b: {[=~"^xxxx$"]: int} | null |
| b: {c: string} | null |
| b: c: "yyyyy" |
| } |
| |
| alwaysCheckPatterns2: { |
| a: #X |
| a: b |
| |
| b: #X |
| b: c: "yyyyy" |
| |
| #X: string | { |
| c: string |
| {[=~"^xxxx$"]: int} |
| } |
| } |
| |
| nestedNonMonotonic: resolved: n1: { |
| x: { a: struct.MinFields(2) } | null |
| x: { a: c: 1 } | null |
| x: { a: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: resolved: n2: { |
| x: { a: b: struct.MinFields(2) } | null |
| x: { a: b: c: 1 } | null |
| x: { a: b: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n1: p1: { |
| x: { a: struct.MaxFields(1) } | null |
| x: { a: c: 1 } | null |
| x: { a: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n1: p2: { |
| x: { a: c: 1 } | null |
| x: { a: struct.MaxFields(1) } | null |
| x: { a: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n1: p2: { |
| x: { a: c: 1 } | null |
| x: { a: d: 1 } | null |
| x: { a: struct.MaxFields(1) } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n2: p1: { |
| x: { a: b: struct.MaxFields(1) } | null |
| x: { a: b: c: 1 } | null |
| x: { a: b: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n2: p2: { |
| x: { a: b: c: 1 } | null |
| x: { a: b: struct.MaxFields(1) } | null |
| x: { a: b: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: eliminated: n2: p2: { |
| x: { a: b: c: 1 } | null |
| x: { a: b: d: 1 } | null |
| x: { a: b: struct.MaxFields(1) } | null |
| } |
| |
| nestedNonMonotonic: incomplete: a: n1: p1: { |
| x: { a: struct.MinFields(2) } | null |
| x: { a: c: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: a: n1: p2: { |
| x: { a: c: 1 } | null |
| x: { a: struct.MinFields(2) } | null |
| } |
| |
| nestedNonMonotonic: incomplete: a: n2: p1: { |
| x: { a: b: struct.MinFields(2) } | null |
| x: { a: b: c: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: a: n2: p2: { |
| x: { a: b: c: 1 } | null |
| x: { a: b: struct.MinFields(2) } | null |
| } |
| |
| |
| nestedNonMonotonic: incomplete: b: n1: p1: { |
| x: { a: struct.MinFields(3) } | null |
| x: { a: c: 1 } | null |
| x: { a: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: b: n1: p2: { |
| x: { a: c: 1 } | null |
| x: { a: struct.MinFields(3) } | null |
| x: { a: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: b: n1: p3: { |
| x: { a: c: 1 } | null |
| x: { a: d: 1 } | null |
| x: { a: struct.MinFields(3) } | null |
| } |
| |
| nestedNonMonotonic: incomplete: b: n2: p1: { |
| x: { a: b: struct.MinFields(3) } | null |
| x: { a: b: c: 1 } | null |
| x: { a: b: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: b: n2: p1: { |
| x: { a: b: c: 1 } | null |
| x: { a: b: struct.MinFields(3) } | null |
| x: { a: b: d: 1 } | null |
| } |
| |
| nestedNonMonotonic: incomplete: b: n2: p1: { |
| x: { a: b: c: 1 } | null |
| x: { a: b: d: 1 } | null |
| x: { a: b: struct.MinFields(3) } | null |
| } |
| |
| preserveClosedness: small: p1: { |
| #A: #B & {a: string} |
| #B: { |
| *{} | {a: string} |
| *{} | {b: int} |
| } |
| } |
| |
| preserveClosedness: small: p2: { |
| #A: #B & {a: string} |
| #B: { |
| {a: string} | *{} |
| *{} | {b: int} |
| } |
| } |
| |
| preserveClosedness: medium: p1: { |
| #A: #B & {a: string} |
| #B: { |
| *{} | {a: string} | {b: string} |
| *{} | {c: int} | {d: string} |
| } |
| } |
| |
| preserveClosedness: medium: p2: { |
| #A: #B & {a: string} |
| #B: { |
| {a: string} | *{} | {b: string} |
| *{} | {c: int} | {d: string} |
| } |
| } |
| |
| preserveClosedness: medium: p3: { |
| #A: #B & {a: string} |
| #B: { |
| {a: string} | {b: string} | *{} |
| *{} | {c: int} | {d: string} |
| } |
| } |
| |
| -- out/eval -- |
| (struct){ |
| disambiguateClosed: (struct){ |
| b: (struct){ |((#struct){ |
| x: (bool){ true } |
| }, (#struct){ |
| y: (bool){ true } |
| }) } |
| a: (struct){ |((#struct){ |
| x: (bool){ true } |
| }, (#struct){ |
| y: (bool){ true } |
| }) } |
| #Def: (struct){ |((#struct){ |
| x: (bool){ true } |
| }, (#struct){ |
| y: (bool){ true } |
| }) } |
| } |
| alwaysCheckMatchers1: (struct){ |
| b: (struct){ |
| c: (string){ "yyyyy" } |
| } |
| } |
| alwaysCheckPatterns2: (struct){ |
| a: (#struct){ |
| c: (string){ "yyyyy" } |
| } |
| b: (#struct){ |
| c: (string){ "yyyyy" } |
| } |
| #X: ((string|struct)){ |((string){ string }, (#struct){ |
| c: (string){ string } |
| }) } |
| } |
| nestedNonMonotonic: (struct){ |
| resolved: (struct){ |
| n1: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (struct){ |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| n2: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (struct){ |
| b: (struct){ |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| } |
| }, (null){ null }) } |
| } |
| } |
| eliminated: (struct){ |
| n1: (struct){ |
| p1: (struct){ |
| x: (null){ null } |
| } |
| p2: (struct){ |
| x: (null){ null } |
| } |
| } |
| n2: (struct){ |
| p1: (struct){ |
| x: (null){ null } |
| } |
| p2: (struct){ |
| x: (null){ null } |
| } |
| } |
| } |
| incomplete: (struct){ |
| a: (struct){ |
| n1: (struct){ |
| p1: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (_|_){ |
| // [incomplete] nestedNonMonotonic.incomplete.a.n1.p1.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): |
| // ./in.cue:84:13 |
| // ./in.cue:84:30 |
| c: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| p2: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (_|_){ |
| // [incomplete] nestedNonMonotonic.incomplete.a.n1.p2.x.a: invalid value {c:1} (does not satisfy struct.MinFields(2)): len(fields) < MinFields(2) (1 < 2): |
| // ./in.cue:90:13 |
| // ./in.cue:90:30 |
| c: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| } |
| n2: (struct){ |
| p1: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (struct){ |
| b: (_|_){ |
| // [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): |
| // ./in.cue:94:16 |
| // ./in.cue:94:33 |
| c: (int){ 1 } |
| } |
| } |
| }, (null){ null }) } |
| } |
| p2: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (struct){ |
| b: (_|_){ |
| // [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): |
| // ./in.cue:100:16 |
| // ./in.cue:100:33 |
| c: (int){ 1 } |
| } |
| } |
| }, (null){ null }) } |
| } |
| } |
| } |
| b: (struct){ |
| n1: (struct){ |
| p1: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (_|_){ |
| // [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): |
| // ./in.cue:105:13 |
| // ./in.cue:105:30 |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| p2: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (_|_){ |
| // [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): |
| // ./in.cue:112:13 |
| // ./in.cue:112:30 |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| p3: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (_|_){ |
| // [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): |
| // ./in.cue:119:13 |
| // ./in.cue:119:30 |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| }, (null){ null }) } |
| } |
| } |
| n2: (struct){ |
| p1: (struct){ |
| x: ((null|struct)){ |((struct){ |
| a: (struct){ |
| b: (_|_){ |
| // [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): |
| // ./in.cue:137:16 |
| // ./in.cue:137:33 |
| c: (int){ 1 } |
| d: (int){ 1 } |
| } |
| } |
| }, (null){ null }) } |
| } |
| } |
| } |
| } |
| } |
| preserveClosedness: (struct){ |
| small: (struct){ |
| p1: (struct){ |
| #A: (struct){ |(*(#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| b: (int){ int } |
| }) } |
| #B: (struct){ |(*(#struct){ |
| }, (#struct){ |
| b: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| b: (int){ int } |
| }) } |
| } |
| p2: (struct){ |
| #A: (struct){ |(*(#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| b: (int){ int } |
| }) } |
| #B: (struct){ |(*(#struct){ |
| }, (#struct){ |
| a: (string){ string } |
| b: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| b: (int){ int } |
| }) } |
| } |
| } |
| medium: (struct){ |
| p1: (struct){ |
| #A: (struct){ |(*(#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }) } |
| #B: (struct){ |(*(#struct){ |
| }, (#struct){ |
| c: (int){ int } |
| }, (#struct){ |
| d: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| b: (string){ string } |
| d: (string){ string } |
| }) } |
| } |
| p2: (struct){ |
| #A: (struct){ |(*(#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }) } |
| #B: (struct){ |(*(#struct){ |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| c: (int){ int } |
| }, (#struct){ |
| d: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| b: (string){ string } |
| d: (string){ string } |
| }) } |
| } |
| p3: (struct){ |
| #A: (struct){ |(*(#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }) } |
| #B: (struct){ |(*(#struct){ |
| }, (#struct){ |
| a: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| a: (string){ string } |
| d: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| }, (#struct){ |
| b: (string){ string } |
| c: (int){ int } |
| }, (#struct){ |
| b: (string){ string } |
| d: (string){ string } |
| }, (#struct){ |
| a: (string){ string } |
| }, (#struct){ |
| c: (int){ int } |
| }, (#struct){ |
| d: (string){ string } |
| }) } |
| } |
| } |
| } |
| } |
| -- out/compile -- |
| --- in.cue |
| { |
| disambiguateClosed: { |
| b: (〈0;#Def〉 & 〈0;a〉) |
| a: 〈0;#Def〉 |
| #Def: { |
| ({ |
| x: true |
| }|{ |
| y: true |
| }) |
| } |
| } |
| alwaysCheckMatchers1: { |
| b: ({ |
| [=~"^xxxx$"]: int |
| }|null) |
| b: ({ |
| c: string |
| }|null) |
| b: { |
| c: "yyyyy" |
| } |
| } |
| alwaysCheckPatterns2: { |
| a: 〈0;#X〉 |
| a: 〈0;b〉 |
| b: 〈0;#X〉 |
| b: { |
| c: "yyyyy" |
| } |
| #X: (string|{ |
| c: string |
| { |
| [=~"^xxxx$"]: int |
| } |
| }) |
| } |
| nestedNonMonotonic: { |
| resolved: { |
| n1: { |
| x: ({ |
| a: 〈import;struct〉.MinFields(2) |
| }|null) |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| resolved: { |
| n2: { |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(2) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n1: { |
| p1: { |
| x: ({ |
| a: 〈import;struct〉.MaxFields(1) |
| }|null) |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n1: { |
| p2: { |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: 〈import;struct〉.MaxFields(1) |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n1: { |
| p2: { |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| x: ({ |
| a: 〈import;struct〉.MaxFields(1) |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n2: { |
| p1: { |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MaxFields(1) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n2: { |
| p2: { |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MaxFields(1) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| eliminated: { |
| n2: { |
| p2: { |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MaxFields(1) |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| a: { |
| n1: { |
| p1: { |
| x: ({ |
| a: 〈import;struct〉.MinFields(2) |
| }|null) |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| a: { |
| n1: { |
| p2: { |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: 〈import;struct〉.MinFields(2) |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| a: { |
| n2: { |
| p1: { |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(2) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| a: { |
| n2: { |
| p2: { |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(2) |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n1: { |
| p1: { |
| x: ({ |
| a: 〈import;struct〉.MinFields(3) |
| }|null) |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n1: { |
| p2: { |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: 〈import;struct〉.MinFields(3) |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n1: { |
| p3: { |
| x: ({ |
| a: { |
| c: 1 |
| } |
| }|null) |
| x: ({ |
| a: { |
| d: 1 |
| } |
| }|null) |
| x: ({ |
| a: 〈import;struct〉.MinFields(3) |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n2: { |
| p1: { |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(3) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n2: { |
| p1: { |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(3) |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| nestedNonMonotonic: { |
| incomplete: { |
| b: { |
| n2: { |
| p1: { |
| x: ({ |
| a: { |
| b: { |
| c: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: { |
| d: 1 |
| } |
| } |
| }|null) |
| x: ({ |
| a: { |
| b: 〈import;struct〉.MinFields(3) |
| } |
| }|null) |
| } |
| } |
| } |
| } |
| } |
| preserveClosedness: { |
| small: { |
| p1: { |
| #A: (〈0;#B〉 & { |
| a: string |
| }) |
| #B: { |
| (*{}|{ |
| a: string |
| }) |
| (*{}|{ |
| b: int |
| }) |
| } |
| } |
| } |
| } |
| preserveClosedness: { |
| small: { |
| p2: { |
| #A: (〈0;#B〉 & { |
| a: string |
| }) |
| #B: { |
| ({ |
| a: string |
| }|*{}) |
| (*{}|{ |
| b: int |
| }) |
| } |
| } |
| } |
| } |
| preserveClosedness: { |
| medium: { |
| p1: { |
| #A: (〈0;#B〉 & { |
| a: string |
| }) |
| #B: { |
| (*{}|{ |
| a: string |
| }|{ |
| b: string |
| }) |
| (*{}|{ |
| c: int |
| }|{ |
| d: string |
| }) |
| } |
| } |
| } |
| } |
| preserveClosedness: { |
| medium: { |
| p2: { |
| #A: (〈0;#B〉 & { |
| a: string |
| }) |
| #B: { |
| ({ |
| a: string |
| }|*{}|{ |
| b: string |
| }) |
| (*{}|{ |
| c: int |
| }|{ |
| d: string |
| }) |
| } |
| } |
| } |
| } |
| preserveClosedness: { |
| medium: { |
| p3: { |
| #A: (〈0;#B〉 & { |
| a: string |
| }) |
| #B: { |
| ({ |
| a: string |
| }|{ |
| b: string |
| }|*{}) |
| (*{}|{ |
| c: int |
| }|{ |
| d: string |
| }) |
| } |
| } |
| } |
| } |
| } |