src/maputil.rs

Fri, 14 Feb 2025 23:31:24 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 14 Feb 2025 23:31:24 -0500
changeset 91
db870f2a2cde
parent 55
7b2ee3e84c5f
permissions
-rw-r--r--

slice_assume_init_mut deprecation workaround

5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
1 /*!
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
2 Utilities for mapping over various container types.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
3 */
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
5 use itertools::izip;
55
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
6 #[cfg(feature = "nightly")]
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use std::mem::MaybeUninit;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
9 /// Trait for a fixed-length container type.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
10 ///
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
11 /// Implemented by [`Loc`][crate::loc::Loc] vectors, [`Cube`][crate::sets::Cube]s,
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
12 /// and basic arrays.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
13 pub trait FixedLength<const N: usize> {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
14 /// Type of elements of the container.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 type Elem;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
16 /// Type of iterators over the elements of the container.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
17 type Iter: Iterator<Item = Self::Elem>;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
18
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
19 /// Returns an iteartor over the elements of the container.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 fn fl_iter(self) -> Self::Iter;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
23 /// Trait for a mutable fixed-length container type.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
24 pub trait FixedLengthMut<const N: usize>: FixedLength<N> {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
25 /// Type of iterators over references to mutable elements of the container.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
26 type IterMut<'a>: Iterator<Item = &'a mut Self::Elem>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
27 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
28 Self: 'a;
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
29
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
30 /// Returns an iterator over mutable references to elements of the container.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 fn fl_iter_mut(&mut self) -> Self::IterMut<'_>;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
34 impl<A, const N: usize> FixedLength<N> for [A; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 type Elem = A;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 type Iter = std::array::IntoIter<A, N>;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 fn fl_iter(self) -> Self::Iter {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 self.into_iter()
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
43 impl<A, const N: usize> FixedLengthMut<N> for [A; N] {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
44 type IterMut<'a>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
45 = std::slice::IterMut<'a, A>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
46 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
47 A: 'a;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 fn fl_iter_mut(&mut self) -> Self::IterMut<'_> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 self.iter_mut()
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
54 impl<'a, A, const N: usize> FixedLength<N> for &'a [A; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 type Elem = &'a A;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 type Iter = std::slice::Iter<'a, A>;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 fn fl_iter(self) -> Self::Iter {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59 self.iter()
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 macro_rules! tuple_or_singleton {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 ($a:ident,) => { $a };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65 ($($a:ident),+) => { ($($a),+) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 macro_rules! make_mapmany {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 ($name:ident, $name_indexed:ident, $var0:ident $($var:ident)* ;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 $etype0:ident $($etype:ident)*, $ctype0:ident $($ctype:ident)*) => {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
71 /// Map over [`FixedLength`] container(s), returning an array.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 pub fn $name<
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 $etype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 $($etype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 $ctype0 : FixedLength<N,Elem=$etype0>,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 $($ctype : FixedLength<N,Elem=$etype>,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 Res,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 const N : usize
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 >(
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 $var0 : $ctype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 $($var : $ctype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 f : impl Fn($etype0, $($etype),*) -> Res
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 ) -> [Res; N] {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 let zipit = izip!($var0.fl_iter(), $($var.fl_iter()),*);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 let map = zipit.map(|tuple_or_singleton!($var0, $($var),*)| f($var0, $($var),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 collect_into_array_unchecked(map)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
90 /// Map over [`FixedLength`] containers(s) and element indices, returning an array.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 pub fn $name_indexed<
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 $etype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 $($etype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 $ctype0 : FixedLength<N,Elem=$etype0>,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 $($ctype : FixedLength<N,Elem=$etype>,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 Res,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 const N : usize
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 >(
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 $var0 : $ctype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 $($var : $ctype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 f : impl Fn(usize, $etype0, $($etype),*) -> Res
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103 ) -> [Res; N] {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 let zipit = (0..N).zip(izip!($var0.fl_iter(), $($var.fl_iter()),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 let map = zipit.map(|(i, tuple_or_singleton!($var0, $($var),*))| f(i, $var0, $($var),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 collect_into_array_unchecked(map)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 make_mapmany!(map1, map1_indexed, a; A, CA);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 make_mapmany!(map2, map2_indexed, a b; A B, CA CB);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 make_mapmany!(map3, map3_indexed, a b c; A B C, CA CB CC);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 make_mapmany!(map4, map4_indexed, a b c d; A B C D, CA CB CC CD);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 make_mapmany!(map5, map5_indexed, a b c d e; A B C D E, CA CB CC CD CE);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 make_mapmany!(map6, map6_indexed, a b c d e f; A B C D E F, CA CB CC CD CE CF);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118 macro_rules! make_mapmany_mut{
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 ($name:ident, $name_indexed:ident, $var0:ident $($var:ident)* ;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 $etype0:ident $($etype:ident)*, $ctype0:ident $($ctype:ident)*) => {
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
121 /// Map over [`FixedLength`] container(s) with mutable references to the first container.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 pub fn $name<
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 $etype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 $($etype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 $ctype0 : FixedLengthMut<N,Elem=$etype0>,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 $($ctype : FixedLength<N,Elem=$etype>,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 const N : usize
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 > (
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130 $var0 : &mut $ctype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 $($var : $ctype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 f : impl Fn(&mut $etype0, $($etype),*)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 ) {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 let zipit = izip!($var0.fl_iter_mut(), $($var.fl_iter()),*);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 zipit.for_each(|tuple_or_singleton!($var0, $($var),*)| f($var0, $($var),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
138 /// Map over [`FixedLength`] container(s) and element indices
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
139 /// with mutable references to the first container.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 pub fn $name_indexed<
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 $etype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 $($etype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 $ctype0 : FixedLengthMut<N,Elem=$etype0>,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145 $($ctype : FixedLength<N,Elem=$etype>,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 const N : usize
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 > (
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 $var0 : &mut $ctype0,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 $($var : $ctype,)*
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 f : impl Fn(usize, &mut $etype0, $($etype),*)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 ) {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 let zipit = (0..N).zip(izip!($var0.fl_iter_mut(), $($var.fl_iter()),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 zipit.for_each(|(i, tuple_or_singleton!($var0, $($var),*))| f(i, $var0, $($var),*));
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 make_mapmany_mut!(map1_mut, map1_indexed_mut, a; A, CA);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 make_mapmany_mut!(map2_mut, map2_indexed_mut, a b; A B, CA CB);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 make_mapmany_mut!(map3_mut, map3_indexed_mut, a b c; A B C, CA CB CC);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 make_mapmany_mut!(map4_mut, map4_indexed_mut, a b c d; A B C D, CA CB CC CD);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 make_mapmany_mut!(map5_mut, map5_indexed_mut, a b c d e; A B C D E, CA CB CC CD CE);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163 make_mapmany_mut!(map6_mut, map6_indexed_mut, a b c d e f; A B C D E F, CA CB CC CD CE CF);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 /// Initialise an array of length `N` by calling `f` multiple times.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
167 pub fn array_init<A, F: Fn() -> A, const N: usize>(f: F) -> [A; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 //[(); N].map(|_| f())
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 core::array::from_fn(|_| f())
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 // /// Initialise an array of length `N` by calling `f` with the index of each element.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 // #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 // pub fn array_gen<A, F : Fn(usize) -> A, const N : usize>(f : F) -> [A; N] {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 // //[(); N].indexmap(|i, _| f(i))
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 // core::array::from_fn(f)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 // }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
179 /// Iterator returned by [`foldmap`][FoldMappable::foldmap] applied to an iterator.
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 2
diff changeset
180
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
181 pub struct FoldMap<I: Iterator<Item = A>, A, B, J: Copy, F: Fn(J, A) -> (J, B)> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
182 iter: I,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
183 f: F,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
184 j: J,
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
187 impl<A, B, I: Iterator<Item = A>, J: Copy, F: Fn(J, A) -> (J, B)> Iterator
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
188 for FoldMap<I, A, B, J, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
189 {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 type Item = B;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 fn next(&mut self) -> Option<B> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 self.iter.next().map(|a| {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 let (jnew, b) = (self.f)(self.j, a);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 self.j = jnew;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 b
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 })
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
201 /// Iterator returned by [`indexmap`][IndexMappable::indexmap] applied to an iterator.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
202 pub struct IndexMap<I: Iterator<Item = A>, A, B, F: Fn(usize, A) -> B> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
203 iter: I,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
204 f: F,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
205 j: usize,
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
207
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
208 impl<A, B, I: Iterator<Item = A>, F: Fn(usize, A) -> B> Iterator for IndexMap<I, A, B, F> {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
209 type Item = B;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211 fn next(&mut self) -> Option<B> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 self.iter.next().map(|a| {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 let b = (self.f)(self.j, a);
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
214 self.j = self.j + 1;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
215 b
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
216 })
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
217 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
218 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
219
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
220 /// Trait for things that can be foldmapped.
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
221 ///
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
222 /// `A` is the type of elements of `Self`, and `J` the accumulator type for the folding.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
223 pub trait FoldMappable<A, J>: Sized {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
224 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
225 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
226 F: Fn(J, A) -> (J, B);
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
227 /// Fold and map over `self` with `f`. `j` is the initial accumulator for folding.
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
228 ///
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
229 /// The output type depends on the implementation, but will generally have elements of
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
230 /// type `B`.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
231 fn foldmap<B, F: Fn(J, A) -> (J, B)>(self, j: J, f: F) -> Self::Output<B, F>;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
232 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
233
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
234 /// Trait for things that can be indexmapped.
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
235 ///
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
236 /// `A` is the type of elements of `Self`.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
237 pub trait IndexMappable<A>: Sized {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
238 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
239 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
240 F: Fn(usize, A) -> B;
2
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
241 /// Map over element indices and elements of `self`.
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
242 ///
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
243 /// The output type depends on the implementation, but will generally have elements of
ac84e995e119 Convert iteration utilities to GATs
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
244 /// type `B`.
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
245 fn indexmap<B, F: Fn(usize, A) -> B>(self, f: F) -> Self::Output<B, F>;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
246 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
247
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
248 impl<'a, A, J: Copy> FoldMappable<&'a A, J> for std::slice::Iter<'a, A> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
249 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
250 = FoldMap<Self, &'a A, B, J, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
251 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
252 F: Fn(J, &'a A) -> (J, B);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
253 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
254 fn foldmap<B, F: Fn(J, &'a A) -> (J, B)>(self, j: J, f: F) -> Self::Output<B, F> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
255 FoldMap { iter: self, j, f }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
259 impl<'a, A> IndexMappable<&'a A> for std::slice::Iter<'a, A> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
260 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
261 = IndexMap<Self, &'a A, B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
262 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
263 F: Fn(usize, &'a A) -> B;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
264 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
265 fn indexmap<B, F: Fn(usize, &'a A) -> B>(self, f: F) -> Self::Output<B, F> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
266 IndexMap {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
267 iter: self,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
268 j: 0,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
269 f,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
270 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
271 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
272 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
273
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
274 impl<A, J: Copy, const N: usize> FoldMappable<A, J> for std::array::IntoIter<A, N> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
275 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
276 = FoldMap<Self, A, B, J, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
277 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
278 F: Fn(J, A) -> (J, B);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
280 fn foldmap<B, F: Fn(J, A) -> (J, B)>(self, j: J, f: F) -> Self::Output<B, F> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
281 FoldMap { iter: self, j, f }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
282 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
283 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
285 impl<'a, A, const N: usize> IndexMappable<A> for std::array::IntoIter<A, N> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
286 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
287 = IndexMap<Self, A, B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
288 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
289 F: Fn(usize, A) -> B;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
291 fn indexmap<B, F: Fn(usize, A) -> B>(self, f: F) -> Self::Output<B, F> {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
292 IndexMap {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
293 iter: self,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
294 j: 0,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
295 f,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
296 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
297 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
298 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
299
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
300 impl<A, J: Copy, const N: usize> FoldMappable<A, J> for [A; N] {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
301 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
302 = [B; N]
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
303 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
304 F: Fn(J, A) -> (J, B);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
305 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
306 fn foldmap<B, F: Fn(J, A) -> (J, B)>(self, j: J, f: F) -> [B; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
307 // //let mut res : [MaybeUninit<B>; N] = unsafe { MaybeUninit::uninit().assume_init() };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
308 // let mut res = MaybeUninit::uninit_array::<N>();
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
309 // for (a, i) in self.into_iter().zip(0..N) {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
310 // let (jnew, b) = f(j, a);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
311 // unsafe { *(res.get_unchecked_mut(i)) = MaybeUninit::new(b) };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
312 // j = jnew;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
313 // }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
314 // //unsafe { res.as_mut_ptr().cast::<[B; N]>().read() }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
315 // unsafe { MaybeUninit::array_assume_init(res) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
316 let it = self.into_iter().foldmap(j, f);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
317 collect_into_array_unchecked(it)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
318 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
319 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
320
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
321 impl<A, const N: usize> IndexMappable<A> for [A; N] {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
322 type Output<B, F>
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
323 = [B; N]
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
324 where
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
325 F: Fn(usize, A) -> B;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
326 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
327 fn indexmap<B, F: Fn(usize, A) -> B>(self, f: F) -> [B; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
328 // //let mut res : [MaybeUninit<B>; N] = unsafe { MaybeUninit::uninit().assume_init() };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
329 // let mut res = MaybeUninit::uninit_array::<N>();
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
330 // for (a, i) in self.into_iter().zip(0..N) {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
331 // let b = f(i, a);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
332 // unsafe { *(res.get_unchecked_mut(i)) = MaybeUninit::new(b) };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
333 // }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
334 // //unsafe { res.as_mut_ptr().cast::<[B; N]>().read() }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
335 // unsafe { MaybeUninit::array_assume_init(res) }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
336 let it = self.into_iter().indexmap(f);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
337 collect_into_array_unchecked(it)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
338 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
339 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
340
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
341 /// This is taken and simplified from core::array to not involve `ControlFlow`,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
342 /// `Try` etc. (Pulling everything including `NeverShortCircuit` turned out
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
343 /// too much to maintain here.)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
344 ///
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
345 /// Pulls `N` items from `iter` and returns them as an array. If the iterator
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
346 /// yields fewer than `N` items, `None` is returned and all already yielded
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
347 /// items are dropped.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
348 ///
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
349 /// Since the iterator is passed as a mutable reference and this function calls
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
350 /// `next` at most `N` times, the iterator can still be used afterwards to
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
351 /// retrieve the remaining items.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
352 ///
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
353 /// If `iter.next()` panicks, all items already yielded by the iterator are
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
354 /// dropped.
55
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
355 #[cfg(feature = "nightly")]
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
356 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
357 pub(crate) fn collect_into_array_unchecked<T, I: Iterator<Item = T>, const N: usize>(
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
358 mut iter: I,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
359 ) -> [T; N] {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
360 if N == 0 {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
361 // SAFETY: An empty array is always inhabited and has no validity invariants.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
362 return unsafe { core::mem::zeroed() };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
363 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
364
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
365 struct Guard<'a, T, const N: usize> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
366 array_mut: &'a mut [MaybeUninit<T>; N],
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
367 initialized: usize,
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
368 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
369
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
370 impl<T, const N: usize> Drop for Guard<'_, T, N> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
371 #[inline]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
372 fn drop(&mut self) {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
373 debug_assert!(self.initialized <= N);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
374
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
375 // SAFETY: this slice will contain only initialized objects.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
376 unsafe {
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
377 for elem in self.array_mut.get_unchecked_mut(..self.initialized) {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
378 elem.assume_init_drop();
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
379 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
380 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
381 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
382 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
383
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
384 let mut array = MaybeUninit::uninit_array::<N>();
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
385 let mut guard = Guard {
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
386 array_mut: &mut array,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
387 initialized: 0,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
388 };
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
389
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
390 while let Some(item) = iter.next() {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
391 // SAFETY: `guard.initialized` starts at 0, is increased by one in the
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
392 // loop and the loop is aborted once it reaches N (which is
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
393 // `array.len()`).
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
394 unsafe {
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
395 guard
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
396 .array_mut
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
397 .get_unchecked_mut(guard.initialized)
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
398 .write(item);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
399 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
400 guard.initialized += 1;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
401
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
402 // Check if the whole array was initialized.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
403 if guard.initialized == N {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
404 core::mem::forget(guard);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
405
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
406 // SAFETY: the condition above asserts that all elements are
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
407 // initialized.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
408 let out = unsafe { MaybeUninit::array_assume_init(array) };
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
409 return out;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
410 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
411 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
412
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
413 unreachable!("Something went wrong with iterator length")
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
414 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
415
55
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
416 #[cfg(not(feature = "nightly"))]
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
417 #[inline]
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
418 pub(crate) fn collect_into_array_unchecked<T, I: Iterator<Item = T>, const N: usize>(
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
419 iter: I,
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
420 ) -> [T; N] {
55
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
421 match iter.collect::<Vec<T>>().try_into() {
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
422 Ok(a) => a,
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
423 Err(_) => panic!("collect_into_array failure: should not happen"),
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
424 }
7b2ee3e84c5f Add "nightly" feature and provide alternative low-performance implementations of several things when not available.
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
425 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
426
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
427 #[cfg(test)]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
428 mod tests {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
429 use super::*;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
430
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
431 #[test]
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
432 fn mapx_test() {
91
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
433 let a = [0, 1, 2];
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
434 let mut b = [2, 1, 0];
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
435 assert_eq!(map1(a, |x| x + 1), [1, 2, 3]);
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
436 assert_eq!(map2(a, b, |x, y| x + y), [2, 2, 2]);
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
437 assert_eq!(map1_indexed(a, |i, y| y - i), [0, 0, 0]);
db870f2a2cde slice_assume_init_mut deprecation workaround
Tuomo Valkonen <tuomov@iki.fi>
parents: 55
diff changeset
438 map1_indexed_mut(&mut b, |i, y| *y = i);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
439 assert_eq!(b, a);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
440 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
441 }

mercurial