Challenge 76

Zigzag Merge Iterator

Implement an iterator that merges two input iterators of i32 by alternating yields (first from iter1, then iter2, etc.) until both are exhausted.

If one ends early, continue with the remaining from the other.

Write your solution below

#![allow(unused)]
fn main() {
// Rust Bytes Challenge Issue #94 Zigzag Merge Iterator

pub fn zigzag_merge(
    iter1: impl Iterator<Item = i32>,
    iter2: impl Iterator<Item = i32>,
) -> impl Iterator<Item = i32> {
    // TODO: implement logic here
    unimplemented!()
}

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

    #[test]
    fn test_equal_length() {
        let i1 = vec![1, 3, 5].into_iter();
        let i2 = vec![2, 4, 6].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![1, 2, 3, 4, 5, 6]);
    }

    #[test]
    fn test_iter1_shorter() {
        let i1 = vec![1, 3].into_iter();
        let i2 = vec![2, 4, 6].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![1, 2, 3, 4, 6]);
    }

    #[test]
    fn test_iter2_shorter() {
        let i1 = vec![1, 3, 5].into_iter();
        let i2 = vec![2, 4].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![1, 2, 3, 4, 5]);
    }

    #[test]
    fn test_both_empty() {
        let i1: Vec<i32> = vec![].into_iter();
        let i2: Vec<i32> = vec![].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![]);
    }

    #[test]
    fn test_one_empty() {
        let i1 = vec![1, 2, 3].into_iter();
        let i2: Vec<i32> = vec![].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![1]);
    }

    #[test]
    fn test_negatives() {
        let i1 = vec![-1, -3].into_iter();
        let i2 = vec![-2, -4].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![-1, -2, -3, -4]);
    }

    #[test]
    fn test_duplicates() {
        let i1 = vec![1, 1].into_iter();
        let i2 = vec![1, 1].into_iter();
        let result: Vec<i32> = zigzag_merge(i1, i2).collect();
        assert_eq!(result, vec![1, 1, 1, 1]);
    }
}
}