3 Commits
Author SHA1 Message Date
nelsbrock 02010fd0aa bump version number to 1.0.1 2025-06-20 16:56:15 +02:00
nelsbrock 3ce16dbc2f doc: rewrite links to be more specific 2025-06-20 16:55:22 +02:00
nelsbrock 0eaae32c9b doc: fix hint about Copy restraint 2025-06-20 16:55:22 +02:00
2 changed files with 16 additions and 18 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "iter_accumulate"
version = "1.0.0"
version = "1.0.1"
authors = ["Niklas Elsbrock <mail@nelsbrock.de>"]
edition = "2021"
description = "An iterator adaptor that accumulates the elements and yields the current accumulated value for each iteration"
+15 -17
View File
@@ -1,30 +1,31 @@
#![no_std]
#![warn(missing_docs)]
//! This crate provides [`accumulate()`], an iterator adaptor that accumulates the elements from the
//! This crate provides [`accumulate`], an iterator adaptor that accumulates the elements from the
//! base iterator using the provided closure.
//!
//! [`accumulate()`] takes two arguments: an initial value, and a closure with two arguments:
//! [`accumulate`] takes two arguments: an initial value, and a closure with two arguments:
//! an 'accumulator', and an element.
//!
//! The initial value is the value the accumulator will have when the closure is first called.
//! On each call to [`next()`], the closure is executed with the current accumulator and the element
//! yielded by the upstream iterator. The return value of the closure is then set as the new value
//! of the accumulator and returned to the caller.
//! On each call to [`Iterator::next`], the closure is executed with the current accumulator and the
//! element yielded by the upstream iterator. The return value of the closure is then set as the new
//! value of the accumulator and returned to the caller.
//!
//! Since the accumulated value needs to be both stored as the accumulator *and* returned to the
//! caller, the accumulator type must implement [`Clone`].
//! caller, the accumulator type must implement [`Copy`]. If you want to operate on non-copyable
//! types, you should use [`Iterator::scan`] instead.
//!
//! The returned iterator is **not** fused and it is not specified what happens when the base
//! iterator returns [`None`].
//! If you want a fused iterator, use [`fuse()`].
//! If you want a fused iterator, use [`Iterator::fuse`].
//!
//! # Differences to [`fold()`]
//! # Differences to [`Iterator::fold`]
//!
//! In principle, [`accumulate()`] is similar to [`fold()`]. However, instead of returning the final
//! accumulated result, it returns an iterator that yields the current value of the accumulator for
//! each iteration. In other words, the last element yielded by [`accumulate()`] is what would have
//! been returned by [`fold()`] if it had been used instead.
//! In principle, [`accumulate`] is similar to [`Iterator::fold`]. However, instead of returning
//! the final accumulated result, it returns an iterator that yields the current value of the
//! accumulator for each iteration. In other words, the last element yielded by [`accumulate`] is
//! what would have been returned by [`Iterator::fold`] if it had been used instead.
//!
//! # Examples
//!
@@ -42,10 +43,7 @@
//! assert_eq!(iter.next(), None);
//! ```
//!
//! [`accumulate()`]: IterAccumulate::accumulate
//! [`fold()`]: Iterator::fold
//! [`next()`]: Iterator::next
//! [`fuse()`]: Iterator::fuse
//! [`accumulate`]: IterAccumulate::accumulate
use core::fmt;
@@ -110,7 +108,7 @@ where
}
}
/// An [`Iterator`] blanket implementation that provides the [`accumulate()`](Self::accumulate)
/// An [`Iterator`] blanket implementation that provides the [`accumulate`](Self::accumulate)
/// function.
pub trait IterAccumulate: Iterator {
/// Creates an iterator adaptor that accumulates the elements from the base iterator using the