im 10.1.0

Assorted immutable collection datatypes
Documentation
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#![feature(test)]

extern crate im;
extern crate test;

use std::iter::FromIterator;
use test::Bencher;

use im::vector::Vector;

fn vector_push_front(b: &mut Bencher, count: usize) {
    b.iter(|| {
        let mut l = Vector::new();
        for i in 0..count {
            l = l.push_front(i)
        }
    })
}

#[bench]
fn vector_push_front_10(b: &mut Bencher) {
    vector_push_front(b, 10)
}

#[bench]
fn vector_push_front_100(b: &mut Bencher) {
    vector_push_front(b, 100)
}

#[bench]
fn vector_push_front_1000(b: &mut Bencher) {
    vector_push_front(b, 1000)
}

fn vector_push_back(b: &mut Bencher, count: usize) {
    b.iter(|| {
        let mut l = Vector::new();
        for i in 0..count {
            l = l.push_back(i)
        }
    })
}

#[bench]
fn vector_push_back_10(b: &mut Bencher) {
    vector_push_back(b, 10)
}

#[bench]
fn vector_push_back_100(b: &mut Bencher) {
    vector_push_back(b, 100)
}

#[bench]
fn vector_push_back_1000(b: &mut Bencher) {
    vector_push_back(b, 1000)
}

fn vector_pop_front(b: &mut Bencher, count: usize) {
    let l = Vector::from_iter(0..(count + 1));
    b.iter(|| {
        let mut p = l.clone();
        for _ in 0..count {
            p = p.pop_front().unwrap().1
        }
    })
}

#[bench]
fn vector_pop_front_10(b: &mut Bencher) {
    vector_pop_front(b, 10)
}

#[bench]
fn vector_pop_front_100(b: &mut Bencher) {
    vector_pop_front(b, 100)
}

#[bench]
fn vector_pop_front_1000(b: &mut Bencher) {
    vector_pop_front(b, 1000)
}

fn vector_pop_back(b: &mut Bencher, count: usize) {
    let l = Vector::from_iter(0..(count + 1));
    b.iter(|| {
        let mut p = l.clone();
        for _ in 0..count {
            p = p.pop_back().unwrap().1
        }
    })
}

#[bench]
fn vector_pop_back_10(b: &mut Bencher) {
    vector_pop_back(b, 10)
}

#[bench]
fn vector_pop_back_100(b: &mut Bencher) {
    vector_pop_back(b, 100)
}

#[bench]
fn vector_pop_back_1000(b: &mut Bencher) {
    vector_pop_back(b, 1000)
}

fn vector_append(b: &mut Bencher, count: usize) {
    let size = Vec::from_iter((0..count).into_iter().map(|i| Vector::from_iter(0..i)));
    b.iter(|| {
        for item in &size {
            item.append(item.clone());
        }
    })
}

#[bench]
fn vector_append_10(b: &mut Bencher) {
    vector_append(b, 10)
}

#[bench]
fn vector_append_100(b: &mut Bencher) {
    vector_append(b, 100)
}

#[bench]
fn vector_append_1000(b: &mut Bencher) {
    vector_append(b, 1000)
}

fn vector_push_front_mut(b: &mut Bencher, count: usize) {
    b.iter(|| {
        let mut l = Vector::new();
        for i in 0..count {
            l.push_front_mut(i);
        }
    })
}

#[bench]
fn vector_push_front_mut_10(b: &mut Bencher) {
    vector_push_front_mut(b, 10)
}

#[bench]
fn vector_push_front_mut_100(b: &mut Bencher) {
    vector_push_front_mut(b, 100)
}

#[bench]
fn vector_push_front_mut_1000(b: &mut Bencher) {
    vector_push_front_mut(b, 1000)
}

fn vector_push_back_mut(b: &mut Bencher, count: usize) {
    b.iter(|| {
        let mut l = Vector::new();
        for i in 0..count {
            l.push_back_mut(i);
        }
    })
}

#[bench]
fn vector_push_back_mut_10(b: &mut Bencher) {
    vector_push_back_mut(b, 10)
}

#[bench]
fn vector_push_back_mut_100(b: &mut Bencher) {
    vector_push_back_mut(b, 100)
}

#[bench]
fn vector_push_back_mut_1000(b: &mut Bencher) {
    vector_push_back_mut(b, 1000)
}

fn vector_pop_front_mut(b: &mut Bencher, count: usize) {
    let l = Vector::from_iter(0..count);
    b.iter(|| {
        let mut p = l.clone();
        for _ in 0..count {
            p.pop_front_mut();
        }
    })
}

#[bench]
fn vector_pop_front_mut_10(b: &mut Bencher) {
    vector_pop_front_mut(b, 10)
}

#[bench]
fn vector_pop_front_mut_100(b: &mut Bencher) {
    vector_pop_front_mut(b, 100)
}

#[bench]
fn vector_pop_front_mut_1000(b: &mut Bencher) {
    vector_pop_front_mut(b, 1000)
}

fn vector_pop_back_mut(b: &mut Bencher, count: usize) {
    let l = Vector::from_iter(0..count);
    b.iter(|| {
        let mut p = l.clone();
        for _ in 0..count {
            p.pop_back_mut();
        }
    })
}

#[bench]
fn vector_pop_back_mut_10(b: &mut Bencher) {
    vector_pop_back_mut(b, 10)
}

#[bench]
fn vector_pop_back_mut_100(b: &mut Bencher) {
    vector_pop_back_mut(b, 100)
}

#[bench]
fn vector_pop_back_mut_1000(b: &mut Bencher) {
    vector_pop_back_mut(b, 1000)
}

fn vector_extend(b: &mut Bencher, count: usize) {
    let vec = Vec::from_iter(0..count);
    b.iter(|| {
        let mut l: Vector<usize> = Vector::new();
        l.extend(vec.iter());
    })
}

#[bench]
fn vector_extend_10(b: &mut Bencher) {
    vector_extend(b, 10)
}

#[bench]
fn vector_extend_100(b: &mut Bencher) {
    vector_extend(b, 100)
}

#[bench]
fn vector_extend_1000(b: &mut Bencher) {
    vector_extend(b, 1000)
}