1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
#![feature(test)] #![feature(associated_type_defaults)] #![feature(specialization)] #![feature(tool_attributes)] extern crate futures; extern crate test; pub mod applicative; pub mod data; pub mod foldable; pub mod function_k; pub mod functor; pub mod instances; pub mod kind; pub mod kinds; pub mod traverse; mod scratch; pub fn identity<A>(a: A) -> A { a } #[cfg(test)] mod tests { use function_k::KindFunctionKExt; use functor::KindFunctorExt; use kind::{IntoKind, Reify}; use kinds::VecKind; use test::{black_box, Bencher}; #[bench] fn bench_vec_map_native(b: &mut Bencher) { b.iter(|| { vec![1, 2, 3] .into_iter() .map(|i| i * 2) .collect::<Vec<i32>>() }); } #[bench] fn bench_vec_map_from_functor(b: &mut Bencher) { b.iter(|| vec![1, 2, 3].into_kind().map(|i| i * 2).reify()); } #[bench] fn bench_vec_map_from_functor_amortized_strings(b: &mut Bencher) { b.iter(|| { let t = vec![1, 2, 3, 4, 5].into_kind().map(|outer| { let n = black_box(1000); let range: Vec<i64> = (0..n).collect(); range.into_kind().map(|i| format!("{}{}", outer, i)).reify() }); let result = t.reify(); result }); } #[bench] fn bench_vec_map_native_amortized_strings(b: &mut Bencher) { b.iter(|| { let t = vec![1, 2, 3, 4, 5].into_iter().map(|outer| { let n = black_box(1000); let range: Vec<i64> = (0..n).collect(); range .into_iter() .map(|i| format!("{}{}", outer, i)) .collect::<Vec<String>>() }); let result = t.collect::<Vec<Vec<String>>>(); result }); } #[bench] fn bench_vec_map_from_functor_amortized_ints(b: &mut Bencher) { b.iter(|| { let t = vec![1, 2, 3, 4, 5].into_kind().map(|outer| { let n = black_box(1000); let range: Vec<i64> = (0..n).collect(); range.into_kind().map(|i| i * outer).reify() }); let result = t.reify(); result }); } #[bench] fn bench_vec_map_native_amortized_ints(b: &mut Bencher) { b.iter(|| { let t = vec![1, 2, 3, 4, 5].into_iter().map(|outer| { let n = black_box(1000); let range: Vec<i64> = (0..n).collect(); range.into_iter().map(|i| i * outer).collect::<Vec<i64>>() }); let result = t.collect::<Vec<Vec<i64>>>(); result }); } #[bench] fn bench_option_map_kind(b: &mut Bencher) { b.iter(|| { let n = black_box(1000); (0..n).into_iter().map(|i| if i % 2 == 0 { None.into_kind().map_kind::<VecKind>() } else { Some(i).into_kind().map_kind::<VecKind>() }) }) } fn native_convert(f: Option<i32>) -> Vec<i32> { match f { Some(i) => vec![i], None => vec![], } } #[bench] fn bench_option_to_vec_native(b: &mut Bencher) { b.iter(|| { let n = black_box(1000); (0..n).into_iter().map(|i| if i % 2 == 0 { native_convert(None) } else { native_convert(Some(i)) }) }) } }