armdb 0.14.1

sharded bitcask key-value storage optimized for NVMe
Documentation
use std::cmp::Ordering;

use armdb::{Dir, PageSpec, StopReason, merge_sorted, page_chunks};

#[derive(Debug, Eq, PartialEq)]
struct Row {
    key: u8,
    payload: u8,
}

impl Ord for Row {
    fn cmp(&self, other: &Self) -> Ordering {
        self.key.cmp(&other.key)
    }
}

impl PartialOrd for Row {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

#[test]
fn crate_root_merge_is_stable_and_coalesces_equal_keys() {
    let rows = merge_sorted(
        Dir::Asc,
        vec![
            vec![Row { key: 1, payload: 1 }, Row { key: 3, payload: 3 }].into_iter(),
            vec![Row { key: 1, payload: 2 }, Row { key: 2, payload: 2 }].into_iter(),
        ],
    )
    .coalesce_equal(|acc, next| acc.payload = acc.payload * 10 + next.payload)
    .collect::<Vec<_>>();

    assert_eq!(
        rows,
        vec![
            Row {
                key: 1,
                payload: 12
            },
            Row { key: 2, payload: 2 },
            Row { key: 3, payload: 3 },
        ],
    );
}

#[test]
fn crate_root_page_chunks_returns_filled_page_and_cursor() {
    let page = page_chunks(
        1_u8..=4,
        PageSpec {
            limit: 2,
            chunk: 3,
            max_examined: None,
        },
        |row| *row,
        |_| Ok(()),
        |row, &()| Ok(Some(row)),
    )
    .expect("infallible test closures");

    assert_eq!(page.items, vec![1, 2]);
    assert_eq!(page.next, Some(2));
    assert_eq!(page.stop, StopReason::Filled);
}