eyeball-im 0.9.0

Observable collections based on the `im` crate.
use imbl::vector;

use eyeball_im::{ObservableVector, ObservableVectorEntry};

#[test]
fn entry() {
    let mut ob: ObservableVector<u8> = ObservableVector::from(vector![1, 2]);
    ObservableVectorEntry::set(&mut ob.entry(1), 3);
    ObservableVectorEntry::remove(ob.entry(0));

    assert_eq!(ob.into_inner(), vector![3]);
}

#[test]
#[should_panic]
fn entry_out_of_range() {
    let mut ob: ObservableVector<String> = ObservableVector::new();
    ob.entry(0);
}

#[test]
fn entries() {
    let mut ob = ObservableVector::from(vector![1, 2, 3]);
    let mut entries = ob.entries();
    while let Some(mut entry) = entries.next() {
        if ObservableVectorEntry::index(&entry) == 1 {
            break;
        }

        ObservableVectorEntry::set(&mut entry, 5);
    }

    assert_eq!(ob.into_inner(), vector![5, 2, 3]);
}

#[test]
fn remove_entries() {
    let mut ob = ObservableVector::from(vector![1, 2, 3]);
    let mut entries = ob.entries();
    while let Some(entry) = entries.next() {
        if ObservableVectorEntry::index(&entry) == 1 {
            unreachable!("index stays 0 is we remove all elements");
        }

        ObservableVectorEntry::remove(entry);
    }
}