reiterator 0.3.0

Lazy repeatable caching iterator that only ever calculates each element once.
Documentation
/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */

//! Basic CI checks that would be a pain in the ass to write with a shell.

const MPL_HEADER: &[u8] = b"/*\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n\n";

fn main() -> std::io::Result<()> {
    check(std::path::Path::new(r"build.rs"))?;
    check(std::path::Path::new(r"src"))?;
    Ok(())
}

fn check(file: &std::path::Path) -> std::io::Result<()> {
    if file.is_dir() {
        for f in std::fs::read_dir(file)? {
            check(&f?.path())?
        }
        Ok(())
    } else {
        let mut read =
            std::io::BufReader::with_capacity(MPL_HEADER.len(), std::fs::File::open(file)?);
        if std::io::BufRead::fill_buf(&mut read)? == MPL_HEADER {
            Ok(())
        } else {
            panic!("{file:?} is missing the verbatim MPL comment (must start at the very first character, and must be followed by a newline). Please copy and paste it from any other file.")
        }
    }
}