Interaction between defaults, embedding and disjunctions. // TODO: at the moment, using a default will select it. -- in.cue -- x: { // All of these resolve to *2 | 3 m1: (1 | (*2 | 3)) & (>=2 & <=3) m2: (1 | (*2 | 3)) & (2 | 3) m3: (*1 | *(*2 | 3)) & (2 | 3) } y1: x & { {m4: x.m1 + x.m2 + x.m3} } y2: { x {m4: y2.m1 + y2.m2 + y2.m3} } Y=y3: { x {m4: Y.m1 + Y.m2 + Y.m3} } y4: x & { {m4: y4.m1 + y4.m2 + y4.m3} } // Second disjunct in embedding is not possible because of previous declaration // of `b`, so it should be resolved to {a: 1}. b: (*"a" | "b") | "c" {a: b} | {b: int} -- out/eval/stats -- Leaks: 0 Freed: 306 Reused: 296 Allocs: 10 Retain: 0 Unifications: 52 Conjuncts: 373 Disjuncts: 306 -- out/eval -- (struct){ x: (struct){ m1: (int){ |(*(int){ 2 }, (int){ 3 }) } m2: (int){ |(*(int){ 2 }, (int){ 3 }) } m3: (int){ |(*(int){ 2 }, (int){ 3 }) } } y1: (struct){ m1: (int){ |(*(int){ 2 }, (int){ 3 }) } m2: (int){ |(*(int){ 2 }, (int){ 3 }) } m3: (int){ |(*(int){ 2 }, (int){ 3 }) } m4: (int){ 6 } } y2: (struct){ m1: (int){ |(*(int){ 2 }, (int){ 3 }) } m2: (int){ |(*(int){ 2 }, (int){ 3 }) } m3: (int){ |(*(int){ 2 }, (int){ 3 }) } m4: (int){ 6 } } y3: (struct){ m1: (int){ |(*(int){ 2 }, (int){ 3 }) } m2: (int){ |(*(int){ 2 }, (int){ 3 }) } m3: (int){ |(*(int){ 2 }, (int){ 3 }) } m4: (int){ 6 } } y4: (struct){ m1: (int){ |(*(int){ 2 }, (int){ 3 }) } m2: (int){ |(*(int){ 2 }, (int){ 3 }) } m3: (int){ |(*(int){ 2 }, (int){ 3 }) } m4: (int){ 6 } } b: (string){ |(*(string){ "a" }, (string){ "b" }, (string){ "c" }) } a: (string){ |(*(string){ "a" }, (string){ "b" }, (string){ "c" }) } } -- out/compile -- --- in.cue { x: { m1: ((1|(*2|3)) & (>=2 & <=3)) m2: ((1|(*2|3)) & (2|3)) m3: ((*1|*(*2|3)) & (2|3)) } y1: (〈0;x〉 & { { m4: ((〈2;x〉.m1 + 〈2;x〉.m2) + 〈2;x〉.m3) } }) y2: { 〈1;x〉 { m4: ((〈2;y2〉.m1 + 〈2;y2〉.m2) + 〈2;y2〉.m3) } } y3: { 〈1;x〉 { m4: ((〈2;y3〉.m1 + 〈2;y3〉.m2) + 〈2;y3〉.m3) } } y4: (〈0;x〉 & { { m4: ((〈2;y4〉.m1 + 〈2;y4〉.m2) + 〈2;y4〉.m3) } }) b: ((*"a"|"b")|"c") ({ a: 〈1;b〉 }|{ b: int }) }