Uploaded image for project: 'Swift'
  1. Swift
  2. SR-4164

Consider treating LazyFilteredCollection like FlattenCollection

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Open
    • Priority: Medium
    • Resolution: Unresolved
    • Component/s: Standard Library
    • Labels:
      None

      Description

      The refusal to pre-count elements of a `FlattenCollection` is based on reasoning about the performance of `flatMap`. But `flatMap`, when applied to collections of optionals, doesn't produce a LazyFlattenedCollection<…>, but a LazyMapCollection<LazyFilterCollection<…>>. We are not doing a similar thing for LazyFilterCollection.

      The following demonstrates:

      struct Foo {
        let i: UInt ;
        init?(_ i: UInt) { print("Foo(\(i))"); if i % 4 == 0 { return nil }; self.i = i }
      }
      Array((0..<10).lazy.flatMap(Foo.init))
      

      which currently generates Foo(i) 3 times for each i in 0..<10. If this FIXME were addressed it would go down to 2 times (once for counting), but if we take the option suggested in this bug, it would go down to 1 (at the cost of Array reallocations due to failing to pre-count, of course).

        Attachments

          Activity

            People

            • Assignee:
              Hektve87 Hector David
              Reporter:
              dabrahams Dave Abrahams
            • Votes:
              1 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated: