<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 7. Jun 2017, at 19:35, Adam Sharp 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="">The new smart key path feature is really lovely, and feels like a great addition to Swift.<br class=""><br class="">It seems like it might be straightforward to add overloads of `map` and `flatMap` to the standard library to make use of the new functionality:<br class=""><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let managers = flatOrganisation.managers<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let allEmployees = Set(managers.flatMap(\.directReports))<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let employeeNames = Set(allEmployees.map(\.name))<br class=""><br class="">This feels like a really natural way of working with key paths in a functional style. It makes a lot of sense for collections, and possibly for Optional too (although as far as I can see optional chaining is more or less equivalent, and with more compact syntax).<br class=""><br class="">I’m hoping that this might be low-hanging fruit that could be considered for the Swift 4 release. I’d be happy to have a go at writing a proposal if there’s interest!<br class=""><br class="">–Adam<br class=""><br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></div></blockquote></div><br class=""><div class="">Working demo:</div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">struct</span><span style="font-variant-ligatures: no-common-ligatures" class=""> VirtualKeyPath<Root, Value> {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> block: (</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">) -> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Value</span> </div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span><span style="font-variant-ligatures: no-common-ligatures" class=""> evaluate(on: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">) -> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Value</span><span style="font-variant-ligatures: no-common-ligatures" class=""> { </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">block</span><span style="font-variant-ligatures: no-common-ligatures" class="">(on) }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">// If we could extend 'Any', this would be possible...</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">//extension Any {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">// subscript(keyPath: VirtualKeyPath<Self, Value>) -> Value {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">// return keyPath.evaluate(on: self)</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">// }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(84, 99, 72);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">//}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">extension</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">KeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">where</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Value: Collection {</span></div></div><div class=""><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span></p></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span><span style="font-variant-ligatures: no-common-ligatures" class=""> map<T>(</span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">_</span><span style="font-variant-ligatures: no-common-ligatures" class=""> descendent: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">KeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Value</span><span style="font-variant-ligatures: no-common-ligatures" class="">.Element, </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">>) -> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">VirtualKeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">, [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">]> {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">VirtualKeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">, [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">]> { (obj: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">) -> [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">] </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">in</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> obj[keyPath: </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">self</span><span style="font-variant-ligatures: no-common-ligatures" class="">].</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">map</span><span style="font-variant-ligatures: no-common-ligatures" class=""> { $0[keyPath: descendent] }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">extension</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">VirtualKeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">where</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Value: Collection {</span></div></div><div class=""><p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span></p></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">func</span><span style="font-variant-ligatures: no-common-ligatures" class=""> map<T>(</span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">_</span><span style="font-variant-ligatures: no-common-ligatures" class=""> descendent: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">KeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Value</span><span style="font-variant-ligatures: no-common-ligatures" class="">.Element, </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">>) -> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">VirtualKeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">, [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">]> {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">VirtualKeyPath</span><span style="font-variant-ligatures: no-common-ligatures" class=""><</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">, [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">]> { (obj: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Root</span><span style="font-variant-ligatures: no-common-ligatures" class="">) -> [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">T</span><span style="font-variant-ligatures: no-common-ligatures" class="">] </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">in</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">return</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">self</span><span style="font-variant-ligatures: no-common-ligatures" class="">.</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">evaluate</span><span style="font-variant-ligatures: no-common-ligatures" class="">(on: obj).</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">map</span><span style="font-variant-ligatures: no-common-ligatures" class=""> { $0[keyPath: descendent] }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">struct</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Person {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> name: </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">String</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">struct</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Department {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> people: [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Person</span><span style="font-variant-ligatures: no-common-ligatures" class="">]</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> nameLengths = (\</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Department</span><span style="font-variant-ligatures: no-common-ligatures" class="">.people).</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">map</span><span style="font-variant-ligatures: no-common-ligatures" class="">(\.name).</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">map</span><span style="font-variant-ligatures: no-common-ligatures" class="">(\.characters.count)</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #323e7d" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> testObj = </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Department</span><span style="font-variant-ligatures: no-common-ligatures" class="">(people: [</span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Person</span><span style="font-variant-ligatures: no-common-ligatures" class="">(name: </span><span style="font-variant-ligatures: no-common-ligatures; color: #853e64" class="">"Alice"</span><span style="font-variant-ligatures: no-common-ligatures" class="">),</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Person</span><span style="font-variant-ligatures: no-common-ligatures" class="">(name: </span><span style="font-variant-ligatures: no-common-ligatures; color: #853e64" class="">"Bob"</span><span style="font-variant-ligatures: no-common-ligatures" class="">),</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Person</span><span style="font-variant-ligatures: no-common-ligatures" class="">(name: </span><span style="font-variant-ligatures: no-common-ligatures; color: #853e64" class="">"Claire"</span><span style="font-variant-ligatures: no-common-ligatures" class="">),</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #587ea8" class="">Person</span><span style="font-variant-ligatures: no-common-ligatures" class="">(name: </span><span style="font-variant-ligatures: no-common-ligatures; color: #853e64" class="">"David"</span><span style="font-variant-ligatures: no-common-ligatures" class="">)])</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(88, 126, 168);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">kp</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">.</span><span style="font-variant-ligatures: no-common-ligatures" class="">evaluate</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(on: </span><span style="font-variant-ligatures: no-common-ligatures" class="">testObj</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">) // returns [5, 3, 6, 5]</span></div></div></blockquote><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""></span></div></div><div class="">As far as making this kind of thing easier in the language is concerned, one thing I can think of is allowing another \ to end the key-path expression, rather than enclosing it with brackets. So:</div><div class=""><br class=""></div><div class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> nameLengths = (\</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">Department</span><span style="font-variant-ligatures: no-common-ligatures;" class="">.people).</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(\.name).</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(\.characters.count)</span></div></div><div class=""></div></div><div class=""><br class=""></div><div class="">Becomes:</div><div class=""><br class=""></div><div class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(50, 62, 125);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class=""> nameLengths = \</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">Department</span><span style="font-variant-ligatures: no-common-ligatures;" class="">.people\.</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(\.name).</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(88, 126, 168);" class="">map</span><span style="font-variant-ligatures: no-common-ligatures;" class="">(\.characters.count)</span></div></div><div class=""></div></div><div class=""><br class=""></div><div class="">And that’s it, I think. It’s quite nice as-is.</div><div class=""><br class=""></div><div class="">- Karl</div><div class=""><br class=""></div></body></html>