Skip to content

Laziness of our iterators #791

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions