coordinode-lsm-tree 5.1.0

Embedded LSM-tree storage engine: BuRR filters, zstd dictionary compression, MVCC, range tombstones, merge operators, K/V separation, AES-256-GCM at rest.
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2024-present, fjall-rs
// Copyright (c) 2026-present, Structured World Foundation

pub trait GrowingWindowsExt<T> {
    fn growing_windows<'a>(&'a self) -> impl Iterator<Item = &'a [T]>
    where
        T: 'a;
}

impl<T> GrowingWindowsExt<T> for [T] {
    fn growing_windows<'a>(&'a self) -> impl Iterator<Item = &'a [T]>
    where
        T: 'a,
    {
        (1..=self.len()).flat_map(|size| self.windows(size))
    }
}

pub trait ShrinkingWindowsExt<T> {
    fn shrinking_windows<'a>(&'a self) -> impl Iterator<Item = &'a [T]>
    where
        T: 'a;
}

impl<T> ShrinkingWindowsExt<T> for [T] {
    fn shrinking_windows<'a>(&'a self) -> impl Iterator<Item = &'a [T]>
    where
        T: 'a,
    {
        (1..=self.len()).rev().flat_map(|size| self.windows(size))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    #[expect(clippy::unwrap_used)]
    fn test_growing_windows() {
        let a = [1, 2, 3, 4, 5];

        let mut windows = a.growing_windows();

        assert_eq!(&[1], windows.next().unwrap());
        assert_eq!(&[2], windows.next().unwrap());
        assert_eq!(&[3], windows.next().unwrap());
        assert_eq!(&[4], windows.next().unwrap());
        assert_eq!(&[5], windows.next().unwrap());

        assert_eq!(&[1, 2], windows.next().unwrap());
        assert_eq!(&[2, 3], windows.next().unwrap());
        assert_eq!(&[3, 4], windows.next().unwrap());
        assert_eq!(&[4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2, 3], windows.next().unwrap());
        assert_eq!(&[2, 3, 4], windows.next().unwrap());
        assert_eq!(&[3, 4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2, 3, 4], windows.next().unwrap());
        assert_eq!(&[2, 3, 4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2, 3, 4, 5], windows.next().unwrap());
    }

    #[test]
    #[expect(clippy::unwrap_used)]
    fn test_shrinking_windows() {
        let a = [1, 2, 3, 4, 5];

        let mut windows = a.shrinking_windows();

        assert_eq!(&[1, 2, 3, 4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2, 3, 4], windows.next().unwrap());
        assert_eq!(&[2, 3, 4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2, 3], windows.next().unwrap());
        assert_eq!(&[2, 3, 4], windows.next().unwrap());
        assert_eq!(&[3, 4, 5], windows.next().unwrap());

        assert_eq!(&[1, 2], windows.next().unwrap());
        assert_eq!(&[2, 3], windows.next().unwrap());
        assert_eq!(&[3, 4], windows.next().unwrap());
        assert_eq!(&[4, 5], windows.next().unwrap());

        assert_eq!(&[1], windows.next().unwrap());
        assert_eq!(&[2], windows.next().unwrap());
        assert_eq!(&[3], windows.next().unwrap());
        assert_eq!(&[4], windows.next().unwrap());
        assert_eq!(&[5], windows.next().unwrap());
    }
}