konst::iter

Macro for_each

Source
macro_rules! for_each {
    ($pattern:pat_param in $($rem:tt)*) => { ... };
}
Expand description

Iterates over all elements of an iterator, const equivalent of Iterator::for_each

§Syntax

for_each!{
    $pattern:pat in $iterator:expr
        $(,$iterator_method:ident ($($method_args:tt)*) )*
        $(,)?
    =>
    $($code:tt)*
}

This macro supports emulating iterator methods by expanding to equivalent code. They are documented in the iterator_dsl module, because they are also supported by other konst::iter macros.

§Examples

§Custom iterator

use konst::iter::{ConstIntoIter, IsIteratorKind};

struct Upto10(u8);

impl ConstIntoIter for Upto10 {
    type Kind = IsIteratorKind;
    type IntoIter = Self;
    type Item = u8;
}

impl Upto10 {
    const fn next(mut self) -> Option<(u8, Self)> {
        if self.0 < 10 {
            let ret = self.0;
            self.0 += 1;
            Some((ret, self))
        } else {
            None
        }
    }
}

const N: u32 = {
    let mut n = 0u32;
    konst::iter::for_each!{elem in Upto10(7) =>
        n = n * 10 + elem as u32;
    }
    n
};

assert_eq!(N, 789);

§Summing pairs

use konst::iter::for_each;
     
const fn add_pairs<const N: usize>(l: [u32; N], r: [u32; N]) -> [u32; N] {
    let mut out = [0u32; N];

    for_each!{(i, val) in &l,zip(&r),map(|(l, r)| *l + *r),enumerate() =>
        out[i] = val;
    }

    out
}

assert_eq!(add_pairs([], []), []);
assert_eq!(add_pairs([3], [5]), [8]);
assert_eq!(add_pairs([3, 5], [8, 13]), [11, 18]);