From 590fdef8ca30c734729c7b57e08b66ea705842fa Mon Sep 17 00:00:00 2001 From: Sean Olson Date: Fri, 9 Sep 2022 15:24:57 -0700 Subject: [PATCH] Implement `PeekingNext` transitively over mutable references. This change applies patterns used for the standard `Iterator` trait to the `PeekingNext` trait. Generic methods require `Self: Sized` and `PeekingNext` is now transitively implemented over mutable references. This allows generic code to easily accept owned and mutably borrowed types that implement `PeekingNext`. This also makes `PeekingNext` object-safe (though this has little utility today). --- src/peeking_take_while.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/peeking_take_while.rs b/src/peeking_take_while.rs index b3a9c5ccb..f8f03ccda 100644 --- a/src/peeking_take_while.rs +++ b/src/peeking_take_while.rs @@ -16,7 +16,18 @@ pub trait PeekingNext : Iterator { /// if `accept` returns true, return it as the next element, /// else None. fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool; + where Self: Sized, + F: FnOnce(&Self::Item) -> bool; +} + +impl<'a, I> PeekingNext for &'a mut I + where I: PeekingNext, +{ + fn peeking_next(&mut self, accept: F) -> Option + where F: FnOnce(&Self::Item) -> bool + { + (*self).peeking_next(accept) + } } impl PeekingNext for Peekable