<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div><br></div><div><br>Am 16.05.2016 um 21:29 schrieb Thorsten Seitz via swift-evolution <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>>:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><br class=""><div><blockquote type="cite" class=""><div class="">Am 15.05.2016 um 10:57 schrieb Adrian Zubarev via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>>:</div><br class="Apple-interchange-newline"><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">I think an important point is that `all<>` should NOT be restricted to having only one reference or value type!</div></blockquote></div><p class="">This is a little problematic and I’m not a compiler expert so from my perspective I could allow that but in a different way you see it (I’ll explain below).</p><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">Ceylon does not have any restrictions like that. You can form the type intersection of String and Integer for example, which are both classes in Ceylon and because Ceylon like Swift only knows single inheritance between classes, the result is simply `Nothing` (the bottom type which has no elements). So there is no need to forbid this explicitly, because the types work out just fine.</div></blockquote></div><p class="">If I remember correctly someone said that `Ceylon` does use `all` and `any` for its Optional?! We can’t to do this in Swift as far as I know our playground.</p><p class="">We don’t have `Nothing` in Swift. The counterpart would be `Optional` but such a type is made explicit by `?` symbol like `Type? == Optional<Type>` and the only equivalent to `Nothing` would be `nil`.</p></div></div></div></blockquote>`Nothing` is the bottom type, i.e. the intersection of all types. It has no members.</div><div>`Nothing` has nothing to do with optionals. Optionals in Ceylon are type unions with the type `Null` which has a single member called `null` (= Swift’s nil).</div><div><br class=""></div><div>Maybe this proposal should start with forbidding creating `All<>` expressions which would evaluate to `Nothing` and a later proposal could introduce the bottom type.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">That been said, if `All<>` would always intersect (what I haven’t proposed here at all) we can’t replace `protocol<>` with `All<>` because if we look at two distinct protocols `A` and `B` and try to merge them into a type `All<A, B>` would resolve in `implicit nil` where the old fashion way is not `protocol<A, B>`. </p></div></div></div></blockquote><div>I don’t know from where you got `implicit nil`. Seems I was a bit unclear :-)</div><div>All<A, B> is the intersection type of A and B, i.e. a type which conforms to A *and* B.</div><div>Only for cases where A and B are *classes* which do *not* share an inheritance relation the result of All<A, B> is `Nothing` (the empty bottom type). This is a special case. The reason is that because of single inheritance it is impossible to define a subtype of two different class hierarchies.</div><div>If A and B are structs the result of All<A, B> is `Nothing` as well, because structs are not subtypeable at all. Note that All<StructA, StructA> will just be StructA, though.</div><div>If at least one of A and B is a protocol it is always possible to define a type that conforms to A and B.</div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">By the way, really an `implicit nil`? This is not a great idea if you ask me. </p><p class="">You may have a look at this document: <a href="https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md" class="">https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md</a></p><p class="">`All<String, Int> == implicit nil` (your way) while it probably `All<String, Int>? == nil` would serve your wished behavior, but again I wasn’t proposing on solving this issue here. I’d like to solve this problem <a href="https://openradar.appspot.com/20990743" class="">https://openradar.appspot.com/20990743</a> and open the door for `AnyStruct`, `AnyEnum`, `AnyValue` (maybe `AnyTuple` someday). This is what your hint for `Any<>` combined with my `All<>` might create.</p><p class="">If we allow multiple reference and value types for `All<>` this will only work with subtypeable types, because as I already described above `All<StructA, StructB>` can’t be merged.</p></div></div></div></blockquote>Yes, as long as subtyping structs is not possible in Swift All<StructA, StructB> would be `Nothing` (again: this is not the type of `nil`).</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">A scenario that will work might look like this:</p><p class="">class A {} class B: A {} class C: B {}</p><p class="">`All<B, C, A>` from the given types and my understanding the compile could and should infer `C` from here (not `B` compared to your example below).</p><div class=""><br class=""></div></div></div></div></blockquote><div><br class=""></div>Oops, sorry, you are right. I again made the error of confusing intersection types (all<>) with union types (any<>). Grrr. I’m used to the type operators, that’s my only excuse…</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">To sum up a little we would have these facts:</p><p class="">- for subtypeable types the compile will search the highest type from the inheritance path and ignore all other lower base types (for `All<A, B>` the compile would infer `B == All<B> == All<B, A>`)</p></div></div></div></blockquote>With `highest` you mean `most specialized`, right? (for me that’s the lowest type :-)</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">- the oder of types should not matter because of the previous fact</p></div></div></div></blockquote>Exactly.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">That been said do we still need the whole inheritance branch inside of `All<>`? I don’t think so.</p></div></div></div></blockquote>Right, the whole branch is definitely not needed.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">Furthermore if we definitely should ignore order of `Types` inside the angle brackets like `All<A, B> == All<B, A>`, because it makes sense from the context of creating a `Type` that is constrained to `A` AND `B` where AND is commutative. I didn’t thought of at first glance, but thanks to your examples it’s clear to me know.</p></div></div></div></blockquote>Yes, `all<>` should be commutative.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><p class="">———</p><p class="">If one would want to store or pass `A` from `class A: ClassB, ProtocolC` in some generic context and we don’t allow a second reference for `All<>` the following sample won’t work (generalized `class` is assumed):</p><p class="">`func <T: class>(value: All<T, ClassB, ProtocolC>)` but you can workaround here `func <T: ClassB>(value: All<T, ProtocolC>)` which can already be done `func <T: ClassB where T: ProtocolC>(value: T)`</p><p class="">The only problem that rises up here is that we can’t store that value inside a non-generic `Type` with both distinct `ClassB` and `ProtocolC` constraints merged together. As you might guess `ProtocolC` is applied onto `A` but not on `B` where `All<ClassB, ProtocolC>` will create a whole new type for us (<a href="https://openradar.appspot.com/20990743" class="">https://openradar.appspot.com/20990743</a>).</p><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">Furthermore you can form type intersections between reference types which inherit from each other. The resulting intersection type is valid and is just equal to the more specific type. And of course you can form type intersections of a reference or value type with itself (i.e. all<SomeClass, SomeClass>).</div></blockquote></div><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">Why should that be useful you may ask?</div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">This generality is important when using intersection types with generics: let’s consider the type of a function forming the intersection of two sets with different element types:</div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">func union<T, U>(a: Set<T>, b: Set<U>) -> Set<all<T, U>> { … }</div></blockquote></div></div></div></div></div></div></blockquote></div></div></blockquote><div><br></div>The text is correctly talking about intersection and the types are correct for forming the intersection, but of course the function should be called `intersection` as well!<div>This applies to its usage in the examples below...</div><div><br></div><div>Maybe we should use `union<>` and `intersection<>` :-)</div><div><br></div><div>-Thorsten </div><div><br></div><div><br><blockquote type="cite"><div><div><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><div class=""><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">Requiring all<T,U> to have at most one reference or value type (which must be at first position) would impose some unnecessary restrictions:</div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">Given the following:</div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">protocol Named {}</div><div class="" style="font-family: 'helvetica Neue', helvetica;">class Person : Named {}</div><div class="" style="font-family: 'helvetica Neue', helvetica;">class Employee : Person {}</div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">let people: Set<Person></div><div class="" style="font-family: 'helvetica Neue', helvetica;">let otherPeople: Set<Person></div><div class="" style="font-family: 'helvetica Neue', helvetica;">let employees: Set<Employee></div><div class="" style="font-family: 'helvetica Neue', helvetica;">let namedOnes: Set<Named></div><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">// unnecessary restriction:</div><div class="" style="font-family: 'helvetica Neue', helvetica;">let x1 = union(namedOnes, people) // not allowed, because result type contains all<Named, Person> </div></blockquote></div><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">// the restriction would require us to write:</div><div class="" style="font-family: 'helvetica Neue', helvetica;">let x2 = union(people, namedOnes) // ok, result type would be Set<all<Person, Named>> which would be simplified by the compiler to Set<Named> </div></blockquote></div></div></div></div></div></div></div></blockquote><div><br class=""></div>Correction: Set<all<Person, Named>> = Set<Person & Named> = Set<Person></div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><div class=""><div class=""><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">(Ceylon does this!)</div></blockquote></div><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">// unnecessary restriction:</div><div class="" style="font-family: 'helvetica Neue', helvetica;">let x3 = union(people, employees) // not allowed, because result type would contain all<Person, Employee> with two reference types</div></blockquote></div><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">// unnecessary restriction</div><div class="" style="font-family: 'helvetica Neue', helvetica;">let x4 = union(people, otherPeople) // not allowed, because result type contains all<Person, Person> with two reference types</div></blockquote></div><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">IMO these should all be allowed (and are possible in Ceylon). </div><div class="" style="font-family: 'helvetica Neue', helvetica;">The result type of x1 would be Set<all<Named, Person>> which would be simplified by the compiler to Set<Named>.</div></blockquote></div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div>Correction: Set<Person></div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">The result type of x2 would be Set<all<Person, Named>> which would be simplified by the compiler to Set<Named>.</div></blockquote></div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div>Correction: again Set<Person></div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;">The result type of x3 would be Set<all<Person, Employee>> which would be simplified by the compiler to Set<Employee>.</div><div class="" style="font-family: 'helvetica Neue', helvetica;">The result type of x4 would be Set<all<Person, Person>> which would be simplified by the compiler to Set<Person>.</div></blockquote></div></div></div></div></div></div></div></div></div></blockquote><div><br class=""></div>These two are correct, at least…</div><div><br class=""></div><div>Sorry again for the confusion!</div><div><br class=""></div><div>-Thorsten</div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; margin: 0px;" class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><div class=""><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div class="" style="font-family: 'helvetica Neue', helvetica;"><br class=""></div><div class="" style="font-family: 'helvetica Neue', helvetica;">-Thorsten</div></blockquote><br class="Apple-interchange-newline"></div>Pleas rethink your example here, `Intersection<>` might be a proposal of its own (there are some problems with `Nothing` I described above).</div></div></div></div></div></div><div class=""><br class=""></div><div class="">——— </div><div class=""><br class=""></div><div class="">`Any<>` will pick only one type from its angle brackets. The types must be distinct to each other, but `Any<>` is a whole other proposal which has its own problems like:</div><div class=""><br class=""></div><div class="">protocol A {} protocol B {} class C: A, B {}</div><div class=""><br class=""></div><div class="">func foo(value: Any<A, B>) {</div><div class=""> // if else if won’t handle `value` correctly if it’s `C`</div><div class="">}</div><div class=""><br class=""></div><div class="">Is such a thing intended? I guess `Any<>` should just proceed when the first match is found at compile time and it’s up to the developer to handle `value` correctly.</div><div class=""><br class=""></div><div class="">In different thread I just answered my vision for `All<>` and future `Any<>`:</div><div class=""><br class=""></div><div class=""><div class="">There are two future directions in my proposal: </div><div class=""> (1) `Any<>` which takes only one type from the angle brackets: `Any<String, Int>` or `String | Int`</div><div class=""> (2) if we already have a generalized `class` keyword, so why we don’t get `struct` and `enum` as well?</div><div class=""><br class=""></div><div class="">With this we can create a typealias for `AnyValue` like this (at least for generalized extendable types): </div><div class=""> `typealias AnyStruct = All<struct>`</div><div class=""> `typealias AnyEnum = All<enum>`</div><div class=""> `typealias AnyValue = Any<All<struct>, All<enum>>`</div><div class=""> `typealias AnyValue = AnyStruct | AnyEnum`</div></div><div class=""><br class=""></div></div><div id="bloop_sign_1463297249978238976" class="bloop_sign" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><div style="font-family: helvetica, arial; font-size: 13px;" class="">-- <br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote></div></body></html>