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
/// A trait which gives the ability for a reducer to reduce a given tuple. This
/// trait is available for all reducers, for all tuples containing types
/// supported by that reducer.
///
/// See [`TupleReducer`] for more information.
/// Perform a reduce operation given the current accumulator and the input type
/// `F`.
///
/// ```
/// use tuplemagic::{TupleReducer, TupleReducerCapable};
/// type T = (u8, u8, u16, u32, u16, u8, Option<()>, Vec<u8>);
///
/// struct TupleReducerSum {}
/// impl TupleReducer<usize, u8> for TupleReducerSum {
/// fn reduce_one(collect: usize, from: u8) -> usize {
/// collect + from as usize
/// }
/// }
/// impl TupleReducer<usize, u16> for TupleReducerSum {
/// fn reduce_one(collect: usize, from: u16) -> usize {
/// collect + from as usize
/// }
/// }
/// impl TupleReducer<usize, u32> for TupleReducerSum {
/// fn reduce_one(collect: usize, from: u32) -> usize {
/// collect + from as usize
/// }
/// }
/// impl<T> TupleReducer<usize, Option<T>> for TupleReducerSum {
/// fn reduce_one(collect: usize, from: Option<T>) -> usize {
/// collect + from.is_some() as usize
/// }
/// }
/// impl<T> TupleReducer<usize, Vec<T>> for TupleReducerSum {
/// fn reduce_one(collect: usize, from: Vec<T>) -> usize {
/// collect + from.len() as usize
/// }
/// }
///
/// let t: T = (1, 10, 100, 1000, 1, 1, Some(()), vec![1]);
/// let out = TupleReducerSum::reduce(t, 0);
/// assert_eq!(out, 1115);
/// ```
pub use tuple_reduce;