Skip to content

Commit 24cb15d

Browse files
authored
Merge pull request #443 from ratmice/split_borrows_tree_example
Cleanups for tree example of splitting borrows
2 parents d94b31e + 7aaad53 commit 24cb15d

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

src/borrow-splitting.md

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ pub struct IterMut<'a, T: 'a>(VecDeque<NodeIterMut<'a, T>>);
215215
impl<T> Tree<T> {
216216
pub fn iter_mut(&mut self) -> IterMut<T> {
217217
let mut deque = VecDeque::new();
218-
self.root.as_mut().map(|root| deque.push_front(root.iter_mut()));
218+
if let Some(root) = self.root.as_mut() {
219+
deque.push_front(root.iter_mut());
220+
}
219221
IterMut(deque)
220222
}
221223
}
@@ -224,53 +226,46 @@ impl<T> Node<T> {
224226
pub fn iter_mut(&mut self) -> NodeIterMut<T> {
225227
NodeIterMut {
226228
elem: Some(&mut self.elem),
227-
left: self.left.as_mut().map(|node| &mut **node),
228-
right: self.right.as_mut().map(|node| &mut **node),
229+
left: self.left.as_deref_mut(),
230+
right: self.right.as_deref_mut(),
229231
}
230232
}
231233
}
232234

233-
234235
impl<'a, T> Iterator for NodeIterMut<'a, T> {
235236
type Item = State<'a, T>;
236237

237238
fn next(&mut self) -> Option<Self::Item> {
238-
match self.left.take() {
239-
Some(node) => Some(State::Node(node)),
240-
None => match self.elem.take() {
241-
Some(elem) => Some(State::Elem(elem)),
242-
None => match self.right.take() {
243-
Some(node) => Some(State::Node(node)),
244-
None => None,
245-
}
246-
}
247-
}
239+
self.left.take().map(State::Node).or_else(|| {
240+
self.elem
241+
.take()
242+
.map(State::Elem)
243+
.or_else(|| self.right.take().map(State::Node))
244+
})
248245
}
249246
}
250247

251248
impl<'a, T> DoubleEndedIterator for NodeIterMut<'a, T> {
252249
fn next_back(&mut self) -> Option<Self::Item> {
253-
match self.right.take() {
254-
Some(node) => Some(State::Node(node)),
255-
None => match self.elem.take() {
256-
Some(elem) => Some(State::Elem(elem)),
257-
None => match self.left.take() {
258-
Some(node) => Some(State::Node(node)),
259-
None => None,
260-
}
261-
}
262-
}
250+
self.right.take().map(State::Node).or_else(|| {
251+
self.elem
252+
.take()
253+
.map(State::Elem)
254+
.or_else(|| self.left.take().map(State::Node))
255+
})
263256
}
264257
}
265258

266259
impl<'a, T> Iterator for IterMut<'a, T> {
267260
type Item = &'a mut T;
268261
fn next(&mut self) -> Option<Self::Item> {
269262
loop {
270-
match self.0.front_mut().and_then(|node_it| node_it.next()) {
263+
match self.0.front_mut().and_then(Iterator::next) {
271264
Some(State::Elem(elem)) => return Some(elem),
272265
Some(State::Node(node)) => self.0.push_front(node.iter_mut()),
273-
None => if let None = self.0.pop_front() { return None },
266+
None => {
267+
self.0.pop_front()?;
268+
}
274269
}
275270
}
276271
}
@@ -279,10 +274,12 @@ impl<'a, T> Iterator for IterMut<'a, T> {
279274
impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
280275
fn next_back(&mut self) -> Option<Self::Item> {
281276
loop {
282-
match self.0.back_mut().and_then(|node_it| node_it.next_back()) {
277+
match self.0.back_mut().and_then(DoubleEndedIterator::next_back) {
283278
Some(State::Elem(elem)) => return Some(elem),
284279
Some(State::Node(node)) => self.0.push_back(node.iter_mut()),
285-
None => if let None = self.0.pop_back() { return None },
280+
None => {
281+
self.0.pop_back()?;
282+
}
286283
}
287284
}
288285
}

0 commit comments

Comments
 (0)