[swift-evolution] Proposal: Filter split extension on Sequence to return tuple of sequences that meet criteria and that do not

gadiraju praneeth praneethgadiraju at gmail.com
Wed Jun 8 16:59:55 CDT 2016


I implemented something similar with two filters initially, but because of
2N vs N I changed it

On Wednesday, June 8, 2016, Dave Abrahams via swift-evolution <
swift-evolution at swift.org> wrote:

>
> on Wed Jun 08 2016, Nate Cook <natecook-AT-gmail.com> wrote:
>
> >> On Jun 8, 2016, at 3:40 PM, Dave Abrahams via swift-evolution <
> swift-evolution at swift.org <javascript:;>> wrote:
> >>
> >>
> >> on Wed Jun 08 2016, Dave Abrahams <swift-evolution at swift.org
> <javascript:;>> wrote:
> >>
> >
> >>> on Wed Jun 08 2016, gadiraju praneeth <swift-evolution at swift.org
> <javascript:;>> wrote:
> >>>
> >>>> Many times, I came across a scenario where I had to filter an array
> with a
> >>>> condition and filter the same array with opposite of that condition.
> For
> >>>> example:
> >>>>
> >>>> let values = [2, 4, 3, 5, 6, 9]
> >>>>
> >>>> let divisibleByTwo = values.filter { $0 % 2 == 0 }
> >>>> let notDivisibleByTwo = values.filter { $0 % 2 != 0 }
> >>>>
> >>>> Is there a way currently where we can filter the array into two arrays
> >>>> based on a condition?
> >>>
> >>> Well, you need a stable partition for this if you care about ordering
> >>> (see
> >>>
> https://github.com/apple/swift/blob/master/test/Prototypes/Algorithms.swift#L299
> )
> >>> but then you can do
> >>>
> >>> var parts = values
> >>> let mid = values.stablePartition { $0 % 2 == 0 }
> >>> let divisibleByTwo = parts.prefix(upTo: mid)
> >>> let notDivisibleByTwo = parts.suffix(from: mid)
> >>>
> >>> Nate Cook has an enhancement to the result of stablyPartitioned in that
> >>> prototype that would let you write:
> >>>
> >>>  let parts = values.stablyPartitioned { $0 % 2 == 0 }
> >>>  let divisibleByTwo = parts.prefix(upTo: parts.partitionPoint)
> >>>  let notDivisibleByTwo = parts.suffix(from: parts.partitionPoint)
> >
> > Mine was for the result of the 'rotated' methods, but should work for
> > the partitioning ones, too. It's not as clear to me what the benefit
> > of the "lazy" partitioning in that Algorithm.swift is
>
> Just to pass “laziness” on from the result, so further computations can
> also be lazy.
>
> > —wouldn't it be better to wrap a collection around two lazy filter
> > sequences?
>
> Perhaps something like a
> LazyFlatMap<CollectionOfTwo<LazyFilterCollection>> would be better, but
> I have the concern that this would evaluate the predicate 2N times for
> each traversal.
>
> > Here is a quick proof of concept of 'divided' and 'partitioned'
> > methods:
> > http://swiftlang.ng.bluemix.net/#/repl/57588cbda79b317716f02e04
> >
> >> Hmm, come to think of it, Nate, maybe there should also be a more
> >> convenient way to get the two partitions from the result.
> >
> > Definitely!
> >
> > Nate
> >
> >> --
> >> Dave
> >>
> >> _______________________________________________
> >> swift-evolution mailing list
> >> swift-evolution at swift.org <javascript:;>
> >> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> --
> Dave
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <javascript:;>
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160608/5b690dd8/attachment.html>


More information about the swift-evolution mailing list