Skip to content

Laziness of our iterators #791

Closed
@Philippe-Cholet

Description

@Philippe-Cholet

Similar to #601 but for all our iterators and iterator adaptors.
Laziness reference: https://doc.rust-lang.org/std/iter/index.html#laziness

And I think each iterator struct should have the related must_use attribute:

  • Adaptors: #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
  • Non-adaptors: #[must_use = "iterators are lazy and do nothing unless consumed"]

Load some items might be unavoidable in some case(?) but surely not all. TODO:

  • Add missing must_use attributes on adaptors #794
  • Make Permutations lazy #793 permutations(n) consumes n items at definition (so not lazy when n >= 1).
  • Make Combinations lazy #795 combinations(n) consumes n items at definition (so not lazy when n >= 1).
  • Make Intersperse[With] lazy #797 intersperse[_with] both consume 1 item at definition.
  • Make Product lazy #800 a.cartesian_product(b) consumes 1 item of a at definition.
    Therefore iproduct!(i_1, i_2, i_n) consumes 1 item of the first n - 1 iterators at definition.
  • Make CoalesceBy lazy #801 coalesce, dedup[_by][_with_count] all consume 1 item at definition.
  • Test the laziness of our iterators #792
  • Create CONTRIBUTING.md #767 mention laziness for new iterator adaptors and where to test it.
  • tuple_combinations::<T> consume 1 item per nested iterator at definition ("T::len()" - 1 items so not lazy for (_, _, ...)).
  • kmerge[_by] collect all items and consume 1 item of each iterator at definition.
  • Maybe update the documentation of all "eager" adaptors to say that there are "eager":
    dropping dropping_back sorted_unstable sorted_unstable_by sorted_unstable_by_key sorted sorted_by sorted_by_key sorted_by_cached_key k_smallest k_smallest_by k_smallest_by_key k_largest k_largest_by k_largest_by_key tail (so dropping[_back] and methods returning Vec[Deque]IntoIter).
    It's already good enough, it says it's "eager", or that "it consumes the entire iterator", or that "if collected to a Vec[Deque], is converted without any extra copying or allocation cost".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions