<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 19, 2016, at 3:18 AM, Adrian Zubarev via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="bloop_markdown" 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; background-color: rgb(254, 254, 254);"><p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">I think I just found a solution to my problem:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">/// - Parameter child: The new `child` to add to the `children` array.
public mutating func add(_ child: Element) {
let clonedChildReference = Reference(cloning: child.reference)
let index = self.reference.children.endIndex
self.mutableInsert(clonedChildReference, at: index, isNotOwnReference: child.reference !== self.reference)
}
/// Warning: Pass only clonded nodes of type Element to this function!
private mutating func mutableInsert(_ node: XML.Node, at index: Int, isNotOwnReference: Bool) {
// * If `self.reference` is NOT uniquely referenced and `node` is a String,
// we should rebuilt own reference.
// * If `self.reference` is NOT uniquely referenced and `node` is a Reference
// `isNotOwnReference` is true, we should rebuilt own reference.
// * If `self.reference` is NOT uniquely referenced and `node` is a clone
// reference to `self.reference` where is `isNotOwnReference` is false, we
// should check if there are more than **two** strong references to rebuild
// own reference, otherwise it's an implementation artifact and we can keep
// old reference (any `node` of type Reference is cloned before it's added
// to the child array).
let isNotKnownUniquelyReferenced = !isKnownUniquelyReferenced(&self.reference)
var shouldRebuildReference = false
switch node.kind {
case .element(_):
let hasMoreThanTwoStrongReferences = (CFGetRetainCount(self.reference) - 1) > 2
shouldRebuildReference = (isNotKnownUniquelyReferenced && isNotOwnReference) || hasMoreThanTwoStrongReferences
case .text(_):
shouldRebuildReference = isNotKnownUniquelyReferenced
}
if shouldRebuildReference {
self.reference = Reference(cloning: self.reference, wholeTree: true)
}
self.reference.insert(node, at: index)
}
</code></pre><p style="margin: 15px 0px;" class="">I’m using<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">CFGetRetainCount(self.reference)</code><span class="Apple-converted-space"> </span>to catch that implementation artifact.</p></div></div></blockquote><div>If people are resorting to CFGetRetainCount, then we have a problem. The optimizer is not under any obligation to bump the refcount to 2.</div><div><br class=""></div><div>There must be a better way to handle this. Rather than passing an</div><div>'isNotOwnReference' flag, I think you should determine whether a clone</div><div>is needed before passing the node into mutableInsert.</div><div><br class=""></div><div>You effectively want an API like root.addSelf().</div><div class=""><br class=""></div><div class="">-Andy</div><blockquote type="cite" class=""><div class=""><div class="bloop_markdown" 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; background-color: rgb(254, 254, 254);"><div style="margin: 15px 0px;" class=""><br class="webkit-block-placeholder"></div></div><div class="bloop_original_html" 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; background-color: rgb(254, 254, 254);"><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><br class=""><div id="bloop_sign_1474279558626446848" class="bloop_sign"><div style="font-family: helvetica, arial; font-size: 13px;" class="">-- <br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div><br class=""><p class="airmail_on" style="margin: 15px 0px;">Am 19. September 2016 um 09:59:24, Adrian Zubarev (<a href="mailto:adrian.zubarev@devandartist.com" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;" class="">adrian.zubarev@devandartist.com</a>) schrieb:</p><blockquote type="cite" class="clean_bq" style="margin: 15px 0px;"><span style="margin-top: 0px; margin-bottom: 0px;" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div><div class=""><div class="bloop_markdown"><p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">Hello Dave,</p><p style="margin: 15px 0px;" class="">thank you for trying to help me. I’ll try to explain the issue with some more details.</p><p style="margin: 15px 0px;" class="">First here is some code:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">extension XML {
public struct Element {
// public for testing
public var reference: Reference
public var name: String { return self.reference.name }
public var children: [Element] {
return self.reference.children.flatMap {
guard case .element(let element) = $0.kind else { return nil }
return Element(wrapping: element)
}
}
public init(name: String) {
self.reference = Reference(name: name)
}
public mutating func add(_ child: Element) {
self.mutableInsert(Reference(cloning: child.reference), at: self.reference.children.endIndex)
}
// Ignore XML.Node, it's a String or Reference
// Parameter `Node` is assumed to be a clone of a reference passed to `add` or `insert` method.
private mutating func mutableInsert(_ node: XML.Node, at index: Int) {
// Clone own reference all way up to the root
if !isKnownUniquelyReferenced(&self.reference) {
self.reference = Reference(cloning: self.reference, wholeTree: true)
}
// Extract a reference or just insert a string as a child
guard case .element(let nodeReference) = node.kind else {
self.reference.insert(node, at: index)
return
}
// Check for possible debelopment bug
if nodeReference === self.reference {
fatalError("wrong usage of `mutableInsert` function")
}
self.reference.insert(nodeReference, at: index)
}
...
}
}
extension XML.Element {
// public for testing
public class Reference : XML.Node {
let name: String
private(set) weak var parent: Reference?
private(set) var children: [XML.Node]
var kind: XML.Node.Kind { return .element(self) }
...
}
}
</code></pre><p style="margin: 15px 0px;" class="">Now lets focus on the problem.</p><p style="margin: 15px 0px;" class="">Every<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">Element</code><span class="Apple-converted-space"> </span>is baked with it’s own<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">Reference</code><span class="Apple-converted-space"> </span>to be able to traverse the tree from any of it’s node all way up to the root for example.</p><p style="margin: 15px 0px;" class="">Lets look again at the scenario I already described:</p><pre style="margin: 15px 0px; font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">var root = XML.Element(name: "root")
var elem = XML.Element(name: "elem")
ObjectIdentifier(root.reference) // 0x000060000026ab40
ObjectIdentifier(elem.reference) // 0x000060800026bb00
isKnownUniquelyReferenced(&root.reference) // true
isKnownUniquelyReferenced(&elem.reference) // true
root.add(elem)
isKnownUniquelyReferenced(&root.reference) // true
root.add(root)
// The reference of root has changed even if the second child
// was cloned and added as a new object to the reference.
// 0x000060000026ab40 <-- was thrown away
isKnownUniquelyReferenced(&root.reference) // true
ObjectIdentifier(root.reference) // 0x000060000026c680 <— new one
</code></pre><p style="margin: 15px 0px;" class="">The way I’m adding children to the tree is that every passed element of type<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">XML.Element</code><span class="Apple-converted-space"> </span>stores a<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">Reference</code>, which will be cloned and added as a new standalone object to the children array.</p><p style="margin: 15px 0px;" class="">The same happens when we try adding<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">root</code><span class="Apple-converted-space"> </span>as it’s own child. We copy<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root</code><span class="Apple-converted-space"> </span>struct which contains the same reference, then we clone it inside<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">add</code><span class="Apple-converted-space"> </span>method, then we pass the new object to the<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">mutableInsert</code><span class="Apple-converted-space"> </span>function. At that point we don’t need the old reference anymore, I’m speaking of<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.add(root)</code>. The problem here is that at that time<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.reference</code><span class="Apple-converted-space"> </span>has 2 strong references which I cannot escape.</p><p style="margin: 15px 0px;" class="">I could workaround the problem if I knew the reference counter value, because I could check if the passed<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">Element</code><span class="Apple-converted-space"> </span>contains the same reference first. And if it does and we have exactly 2 strong references, I don’t need to recreate<span class="Apple-converted-space"> </span><code style="font-family: Menlo, Consolas, 'Liberation Mono', Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">root.reference</code><span class="Apple-converted-space"> </span>here.</p><p style="margin: 15px 0px;" class="">But I couldn’t find any API for that. :/</p></div><div class="bloop_original_html"><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><br class=""><div id="bloop_sign_1474267770105763840" class="bloop_sign"><div style="font-family: helvetica, arial; font-size: 13px;" class="">-- <br class="">Adrian Zubarev<br class="">Sent with Airmail</div></div><br class=""><p class="airmail_on" style="margin: 15px 0px;">Am 19. September 2016 um 05:50:57, Dave Abrahams via swift-users (<a href="mailto:swift-users@swift.org" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none;" class="">swift-users@swift.org</a>) schrieb:</p><blockquote type="cite" class="clean_bq" style="margin: 15px 0px;"><div style="margin-top: 0px; margin-bottom: 0px;" class=""><div class=""><span class=""><br class="">on Sun Sep 18 2016, Adrian Zubarev <<a href="http://swift-users-AT-swift.org" class="">swift-users-AT-swift.org</a>> wrote:<br class=""><br class="">> Dear Swift community,<br class="">><br class="">> currently I’m building a value type XML library which is baked behind<br class="">> the scene with a reference type to manage graph traversing between<br class="">> nodes. I also like to COW optimize the xml graph, but I run into one<br class="">> single problem atm.<br class="">><br class="">> Image this xml tree:<br class="">><br class="">> <root><br class="">> <item/><br class="">> </root><br class="">> It’s just a root element with one single child. As for value types it<br class="">> should be totally fine to do something like this:<br class="">><br class="">> // The given xml tree<br class="">> var root = XML.Element(name: "root")<br class="">> let item = XML.Element(name: "item")<br class="">> root.add(item)<br class="">><br class="">> // The problematic behavior<br class="">> root.add(root)<br class="">> If this would be a simple value type without any references behind the<br class="">> scenes you could imagine that the result of the last code line will<br class="">> look like this:<br class="">><br class="">> <root><br class="">> <item/><br class="">> <root><br class="">> <item/><br class="">> </root><br class="">> </root><br class=""><br class="">Yep, that's exactly the right answer for a tree with value semantics.<br class="">The simplest way to implement this tree is to use an Array for the child<br class="">nodes.<br class=""><br class="">> Basically we copied the whole tree and added it as the second child<br class="">> into the original root element.<br class="">><br class="">> As for COW optimization this is a problem, just because the passed<br class="">> root is a copy of a struct that contains the exact same reference as<br class="">> the original root element.<br class=""><br class="">I don't understand why that's a problem.<br class=""><br class="">> isKnownUniquelyReferenced(&self.reference) will result in false inside<br class="">> the add method.<br class=""><br class="">...as it should.<br class=""><br class="">> Is there any chance I could force my program to decrease the reference<br class="">> counter of that last item after I’m sure I don’t need it?!<br class=""><br class="">Which last item? When are you sure you don't need it? What result do<br class="">you hope for?<br class=""><br class="">> A few more details: inside the add method I’m always cloning the<br class="">> passed reference just because graphs aren’t that trivial and otherwise<br class="">> I could possibly end up with a cycle graph, which would be really<br class="">> bad. After that job I’m sure that I don’t need the passed reference<br class="">> anymore and I need a way to escape from it.<br class="">><br class="">> I’d appreciate any suggestions and help. :)<br class=""><br class="">It's not clear what you want to acheive nor can I picture the code<br class="">you're using to acheive it, so it's hard to give useful feedback.<br class=""><br class="">Sorry,<br class=""><br class="">--<br class="">-Dave<br class=""><br class="">_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></span></div></div></blockquote></div><div class="bloop_markdown"></div></div></div></span></blockquote></div><div class="bloop_markdown" 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; background-color: rgb(254, 254, 254);"><div style="margin: 15px 0px; -webkit-margin-before: 0px;" class=""><br class="webkit-block-placeholder"></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; background-color: rgb(254, 254, 254); 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; background-color: rgb(254, 254, 254);" 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; background-color: rgb(254, 254, 254); 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; background-color: rgb(254, 254, 254);" 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; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></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; background-color: rgb(254, 254, 254);" 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; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></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; background-color: rgb(254, 254, 254);" class=""></div></blockquote></div><br class=""></body></html>