just_linked 0.1.0

fast linked list;give you a different feeling!
Documentation
use just_linked::LURLinked;

#[test]
fn lur_linked_push_remove() {
    let mut lur = LURLinked::new();
    let one = lur.push("1".to_string());
    let tow = lur.push("2".to_string());
    let three = lur.push("3".to_string());

    assert_eq!(lur.remove(one), Some("1".to_string()));
    assert_eq!(lur.remove(tow), Some("2".to_string()));
    assert_eq!(lur.remove(three), Some("3".to_string()));

    let one = lur.push("1".to_string());
    let tow = lur.push("2".to_string());
    let three = lur.push("3".to_string());

    assert_eq!(lur.remove(three), Some("3".to_string()));
    assert_eq!(lur.remove(tow), Some("2".to_string()));
    assert_eq!(lur.remove(one), Some("1".to_string()));

    let one = lur.push("1".to_string());
    let tow = lur.push("2".to_string());
    let three = lur.push("3".to_string());

    assert_eq!(lur.remove(tow), Some("2".to_string()));
    assert_eq!(lur.remove(three), Some("3".to_string()));
    assert_eq!(lur.remove(one), Some("1".to_string()));

    let one = lur.push("1".to_string());
    let tow = lur.push("2".to_string());
    let three = lur.push("3".to_string());

    assert_eq!(lur.remove(one), Some("1".to_string()));
    assert_eq!(lur.remove(three), Some("3".to_string()));
    assert_eq!(lur.remove(tow), Some("2".to_string()));
}

#[test]
fn lur_linked_move_front() {
    let mut lur: LURLinked<usize> = LURLinked::new();

    let one = lur.push(1);
    lur.move_front(one).unwrap();
    assert_eq!(lur.remove(one), Some(1));

    let one = lur.push(1);
    let tow = lur.push(2);
    let three = lur.push(3);

    lur.move_front(one).unwrap();
    assert_eq!(lur.remove(one), Some(1));
    lur.move_front(tow).unwrap();
    assert_eq!(lur.remove(tow), Some(2));
    lur.move_front(three).unwrap();
    assert_eq!(lur.remove(three), Some(3));

    for i in 1..10000 {
        lur.push(i);
    }

    let one = lur.push(1);
    let tow = lur.push(2);
    let three = lur.push(3);

    assert_eq!(lur.get(one), Some(&1));
    assert_eq!(lur.get_mut(tow), Some(&mut 2));

    lur.move_front(three).unwrap();
    assert_eq!(lur.remove(three), Some(3));
    lur.shrink_to_fit();
    lur.move_front(tow).unwrap();
    assert_eq!(lur.remove(tow), Some(2));
    lur.move_front(one).unwrap();
    assert_eq!(lur.remove(one), Some(1));

    let one = lur.push(1);
    let tow = lur.push(2);
    let three = lur.push(3);

    lur.move_front(one).unwrap();
    assert_eq!(lur.remove(tow), Some(2));
    lur.move_front(three).unwrap();
    assert_eq!(lur.remove(one), Some(1));
    lur.move_front(three).unwrap();
    assert_eq!(lur.remove(three), Some(3));
}

#[test]
fn lur_linked_remove_last() {
    let mut lur: LURLinked<usize> = LURLinked::new();
    assert_eq!(lur.remove_last(), None);
    lur.push(1);
    assert_eq!(lur.len(), 1);
    assert_eq!(lur.remove_last(), Some(1));

    lur.push(1);
    lur.push(2);
    lur.push(3);

    assert_eq!(lur.remove_last(), Some(1));
    assert_eq!(lur.remove_last(), Some(2));
    assert_eq!(lur.remove_last(), Some(3));
    assert_eq!(lur.remove_last(), None);

    let one = lur.push(1);
    lur.push(2);
    let three = lur.push(3);
    lur.move_front(one).unwrap();
    assert_eq!(lur.remove_last(), Some(2));
    lur.move_front(three).unwrap();
    assert_eq!(lur.remove_last(), Some(1));
    assert_eq!(lur.remove_last(), Some(3));

    lur.push(1);
    lur.push(2);
    lur.push(3);
    lur.clear();
    assert_eq!(lur.remove_last(), None);
    lur.shrink_to_fit();
}

#[test]
fn test_iter() {
    let mut lur = LURLinked::new();
    for i in 1..10i32 {
        lur.push(i);
    }
    println!("{}", lur.len());

    for (key, value) in lur.iter() {
        println!("key:{key},value:{value}")
    }

    for (key, value) in lur.iter().rev() {
        println!("rev key:{key},value:{value}")
    }

    let mut iter = lur.iter();
    for i in 0..9 {
        if i % 2 == 0 {
            if let Some((key, value)) = iter.next() {
                println!("key:{key},value:{value}")
            } else {
                panic!("1")
            }
        } else {
            if let Some((key, value)) = iter.next_back() {
                println!("back key:{key},value:{value}")
            } else {
                panic!("2")
            }
        }
    }

    lur.remove_last();
    let mut iter = lur.iter();
    assert_eq!(iter.len(), 8);
    iter.next();
    assert_eq!(iter.len(), 7);
    iter.next_back();
    assert_eq!(iter.len(), 6);
}

#[test]
fn test_iter_mut() {
    let mut lur = LURLinked::new();
    for i in 1..10i32 {
        lur.push(i);
    }

    for (_, item) in lur.iter_mut() {
        *item += 1;
    }

    for (key, value) in lur.iter() {
        println!("key:{key},value:{value}")
    }

    for key in 0..9usize {
        let p = key as i32 + 2;
        assert_eq!(lur.get(key), Some(&p))
    }

    for (key, value) in lur.iter_mut().rev() {
        println!("rev key:{key},value:{value}")
    }

    let mut iter = lur.iter_mut();
    for i in 0..9 {
        if i % 2 == 0 {
            if let Some((key, value)) = iter.next() {
                println!("key:{key},value:{value}")
            } else {
                panic!("1")
            }
        } else {
            if let Some((key, value)) = iter.next_back() {
                println!("back key:{key},value:{value}")
            } else {
                panic!("2")
            }
        }
    }

    lur.remove_last();
    let mut iter = lur.iter_mut();
    assert_eq!(iter.len(), 8);
    iter.next();
    assert_eq!(iter.len(), 7);
    iter.next_back();
    assert_eq!(iter.len(), 6);

    lur.clear();
}

#[test]
fn test_into_iter() {
    let mut lur = LURLinked::new();
    for i in 1..10i32 {
        lur.push(i);
    }

    for value in lur.into_iter() {
        println!("value:{value}")
    }

    let mut lur = LURLinked::new();
    for i in 1..10i32 {
        lur.push(i);
    }

    let ref_lur = &lur;
    for (key, value) in ref_lur.into_iter() {
        println!("key:{key},value:{value}")
    }

    let ref_mut_lur = &mut lur;
    for (key, value) in ref_mut_lur.into_iter() {
        println!("mut key:{key},value:{value}")
    }
}