higher_order_functions 0.2.0

A small collection of traits for implementing higher order functions
Documentation
#![feature(array_zip)]

use higher_order_functions::Zip;

#[test]
fn zip_empty_arrays() {
	let arr = [].zip_with([], |_: (), _: ()| panic!("Shouldn't call zip function"));
	assert_eq!(arr, []);
}

#[test]
fn zip_singleton_arrays() {
	let mut called = false;
	let arr = [123].zip_with([456], |a, b| {
		assert_eq!(a, 123);
		assert_eq!(b, 456);
		if called { panic!("Should only call zip function once"); }
		else { called = true; }
		321
	});
	assert!(called);
	assert_eq!(arr, [321]);
}

#[test]
fn zip_tuples() {
	let a = [1, 2, 3];
	let b = ["a", "b", "c"];
	
	let arr = a.zip_with(b, |ax, bx| (ax, bx));
	
	assert_eq!(arr, [(1, "a"), (2, "b"), (3, "c")]);
}

#[test]
fn zip_multiply() {
	let a = [1, 2, 3];
	let b = [4, 5, 6];
	
	let arr = a.zip_with(b, |ax, bx| ax * bx);
	
	assert_eq!(arr, [4, 10, 18]);
}