segtree 0.1.0

Segment tree implementation in rust
Documentation
pub mod node;
pub mod tree;

pub fn sum<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
    return a + b;
}

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

    #[test]
    fn i64() {
        let a: Vec<i64> = vec![1000000000, 5000000000, 3, 4, 5];

        let tr = Tree::<i64>::new(&a, super::sum, 0);

        assert_eq!(tr.get(0, 2), 6000000000_i64); // 1000000000 + 5000000000 = 6000000000
    }

    #[test]
    fn sum() {
        let a = vec![1, 2, 3, 4, 5];

        let mut tr = Tree::<i32>::new(&a, super::sum, 0);

        assert_eq!(tr.get(0, 3), 6); // 1 + 2 + 3 = 6
        tr.update(1, 4); // [1, 4, 3, 4, 5]
        assert_eq!(tr.get(0, 2), 5); // 1 + 4 = 5
    }

    #[test]
    fn min() {
        let a = vec![5, 4, 3, 2, 1];

        let mut tr = Tree::<i32>::new(&a, std::cmp::min, 1000);

        assert_eq!(tr.get(0, 3), 3); // min(5, 4, 3) = 3
        tr.update(1, -100); // [5, -100, 3, 2, 1]
        assert_eq!(tr.get(0, 4), -100); // min(5, -100, 3, 2) = -100
    }

    #[test]
    fn max() {
        let a = vec![1, 2, 3, 4, 5];

        let mut tr = Tree::<i32>::new(&a, std::cmp::max, -1000);

        assert_eq!(tr.get(0, 3), 3); // max(1, 2, 3) = 3
        tr.update(1, 100); // [1, 100, 3, 4, 5]
        assert_eq!(tr.get(1, 5), 100); // max(100, 3, 4, 5) = 100
    }
}