memcond 0.1.0

Assertion memoizer. Safely bring the outcome of an assertion next the code where it is actually useful.
Documentation
use std::cell::Cell;

use memcond::memcond;

#[allow(clippy::declare_interior_mutable_const)]
const CELL: Cell<u32> = Cell::new(123);

memcond! {
    const fn is_page_address(address: u64) -> bool {
        address % 4096 == 0 && CELL.replace(321) == 123
    }

    #[derive(Clone, Copy, PartialEq, Eq)]
    pub struct PageAddress;
}

memcond! {
    const fn is_finite(number: f64) -> bool {
        number.is_finite()
    }

    #[derive(Clone, Copy)]
    pub struct FiniteF64;
}

memcond! {
    const fn number_in_range(number: u32, min: u32, max: u32) -> bool {
        min <= number && number <= max
    }

    #[derive(Clone, Copy)]
    pub struct NumberInRange;
}

#[allow(clippy::borrow_interior_mutable_const)]
#[test]
fn cell_works() {
    let page = PageAddress::new(4096).unwrap();
    let _page2 = PageAddress::new(4096).unwrap();
    assert_eq!(123, crate::CELL.replace(321));
    assert_eq!(123, crate::CELL.replace(321));
    assert_eq!(123, crate::CELL.get());
    assert_eq!(4096, page.address());
}

#[test]
fn number_in_range_works() {
    assert!(NumberInRange::new(10, 0, 100).is_ok());
    assert!(NumberInRange::new(0, 0, 100).is_ok());
    assert!(NumberInRange::new(100, 0, 100).is_ok());
    assert!(NumberInRange::new(101, 0, 100).is_err());
}