collate 0.4.2

Traits and a data structure to support collation and bisection
Documentation
pub use diff::*;
pub use merge::*;
pub use try_diff::*;
pub use try_merge::*;

mod diff;
mod merge;
mod try_diff;
mod try_merge;

#[cfg(test)]
mod tests {
    use super::*;
    use crate::Collator;
    use futures::stream::{self, StreamExt, TryStreamExt};
    use std::fmt;

    #[derive(Debug)]
    struct Error(String);

    impl fmt::Display for Error {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            self.0.fmt(f)
        }
    }

    impl std::error::Error for Error {}

    #[tokio::test]
    async fn test_diff() {
        let collator = Collator::<u32>::default();

        let left = vec![1, 3, 5, 7, 8, 9, 20];
        let right = vec![2, 4, 5, 6, 8, 9];

        let expected = vec![1, 3, 7, 20];
        let actual = diff(collator, stream::iter(left), stream::iter(right))
            .collect::<Vec<u32>>()
            .await;

        assert_eq!(expected, actual);
    }

    #[tokio::test]
    async fn test_try_diff() {
        let collator = Collator::<u32>::default();

        let left = vec![1, 3, 5, 7, 8, 9, 20];
        let right = vec![2, 4, 5, 6, 8, 9];

        let expected = vec![1, 3, 7, 20];
        let mut actual = Vec::with_capacity(expected.len());

        let mut stream = try_diff(
            collator,
            stream::iter(left).map(Result::<u32, Error>::Ok),
            stream::iter(right).map(Result::<u32, Error>::Ok),
        );

        while let Some(n) = stream.try_next().await.expect("n") {
            actual.push(n);
        }

        assert_eq!(expected, actual);
    }

    #[tokio::test]
    async fn test_merge() {
        let collator = Collator::<u32>::default();

        let left = vec![1, 3, 5, 7, 8, 9, 20];
        let right = vec![2, 4, 6, 8, 9, 10, 11, 12];

        let expected = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20];
        let actual = merge(collator, stream::iter(left), stream::iter(right))
            .collect::<Vec<u32>>()
            .await;

        assert_eq!(expected, actual);
    }

    #[tokio::test]
    async fn test_try_merge() {
        let collator = Collator::<u32>::default();

        let left = vec![1, 3, 5, 7, 8, 9, 20];
        let right = vec![2, 4, 6, 8, 9, 10, 11, 12];

        let expected = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20];
        let mut actual = Vec::with_capacity(expected.len());

        let mut stream = try_merge(
            collator,
            stream::iter(left).map(Result::<u32, Error>::Ok),
            stream::iter(right).map(Result::<u32, Error>::Ok),
        );

        while let Some(n) = stream.try_next().await.expect("n") {
            actual.push(n);
        }

        assert_eq!(expected, actual);
    }
}