<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div>It's true, empty sequences aren't inherently unsafe but an oversight of the nil case can lead to unexpected empty sequences which then lead to bugs. Eg.:</div><div><br></div><div>let number = Int(string)</div><div>for i in sequence(first: number, next: { $0 * 2 - 1 }).prefix(10) {</div><div>&nbsp; &nbsp; print(i)</div><div>}</div><div><br></div><div>If the string cannot be converted to an Int the for loop doesn't run at all. However the original intention was to provide a default and the loop should run in either case:</div><div><br></div><div>let number = Int(string) ?? 2</div><div><br></div><div>This could be a scenario where "first" should be of type "T". And checking for nil isn't that hard if you want to avoid to run the loop in the nil case.</div><div><br>Am 15.08.2016 um 23:33 schrieb Tim Vermeulen &lt;<a href="mailto:tvermeulen@me.com">tvermeulen@me.com</a>&gt;:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><div class="">I doubt that’s it, in no way is an an empty sequence inherently unsafe. The entire standard library is built with empty sequences in mind. I’m more inclined to think it’s an oversight.</div><br class=""><div><blockquote type="cite" class=""><div class="">On 15 Aug 2016, at 23:15, Maximilian Hünenberger &lt;<a href="mailto:m.huenenberger@me.com" class="">m.huenenberger@me.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="content-type" content="text/html; charset=utf-8" class=""><div dir="auto" class=""><div class=""></div><div class="">Ok, I see. However this could be a potential source of bugs/performance issues where you don't consider the nil case and you do some unnecessary work. By prohibiting to pass nil you have to manually unwrap and you immediately see the "optionality".</div><div class=""><br class="">Am 15.08.2016 um 22:36 schrieb Tim Vermeulen &lt;<a href="mailto:tvermeulen@me.com" class="">tvermeulen@me.com</a>&gt;:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div class="">Oh, that’s true, I misunderstood your previous message. It’s not about passing nil, but it’s about passing optionals. The point is to be able to do something like this:</div><div class=""><br class=""></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: #ba2da2" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> number = functionThatReturnsAnOptional()</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">sequence(first: </span><span style="font-variant-ligatures: no-common-ligatures; color: #4f8187" class="">number</span><span style="font-variant-ligatures: no-common-ligatures" class="">, next: { $0 % </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">2</span><span style="font-variant-ligatures: no-common-ligatures" class=""> == </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">0</span><span style="font-variant-ligatures: no-common-ligatures" class=""> ? $0 / </span><span style="font-variant-ligatures: no-common-ligatures; color: #272ad8" class="">2</span><span style="font-variant-ligatures: no-common-ligatures" class=""> : </span><span style="font-variant-ligatures: no-common-ligatures; color: #ba2da2" class="">nil</span><span style="font-variant-ligatures: no-common-ligatures" class=""> })</span></div></div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 15 Aug 2016, at 22:26, Maximilian Hünenberger &lt;<a href="mailto:m.huenenberger@me.com" class="">m.huenenberger@me.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Probably I didn't understand your proposal. What do you want to change exactly?<br class=""><br class="">I thought:<br class="">public func sequence&lt;T&gt;(first: T, next: @escaping (T) -&gt; T?) -&gt; UnfoldFirstSequence&lt;T&gt; { ... }<br class=""><br class="">To:<br class="">public func sequence&lt;T&gt;(first: T?, next: @escaping (T) -&gt; T?) -&gt; UnfoldFirstSequence&lt;T&gt; { ... }<br class=""><br class=""><blockquote type="cite" class="">Am 15.08.2016 um 22:17 schrieb Tim Vermeulen &lt;<a href="mailto:tvermeulen@me.com" class="">tvermeulen@me.com</a>&gt;:<br class=""><br class="">You can’t; the `first` parameter has type `T`, not `T?`.<br class=""><br class=""><blockquote type="cite" class="">On 15 Aug 2016, at 22:10, Maximilian Hünenberger &lt;<a href="mailto:m.huenenberger@me.com" class="">m.huenenberger@me.com</a>&gt; wrote:<br class=""><br class="">Hi Tim,<br class=""><br class="">If you pass "nil" to "first" isn't this an empty sequence? So it would be redundant.<br class=""><br class="">Best regards<br class="">Maximilian<br class=""><br class=""><blockquote type="cite" class="">Am 15.08.2016 um 01:27 schrieb Tim Vermeulen via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt;:<br class=""><br class="">sequence(first:next:) takes a non-optional first argument. Is there a reason for that? sequence(state:next:) allows empty sequences, and I don’t see why sequence(first:next:) shouldn’t. The fix would be to simply add the `?` in the function signature; no other changes are required to make it work.<br class=""><br class="">I considered just filing a bug report, but since this is a change of the public API...<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=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></blockquote></blockquote><br class=""></blockquote></div></div></blockquote></div><br class=""></div></blockquote></div></div></blockquote></div><br class=""></div></blockquote></body></html>