From 574138a1dcaa8d4c9e9136bd4d2d1ba885b6949b Mon Sep 17 00:00:00 2001 From: Wim Looman Date: Wed, 6 Feb 2019 14:26:24 +0100 Subject: [PATCH] Move map to an inherent trait method (hits https://github.com/rust-lang/rust/issues/53457) --- src/iter.rs | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/iter.rs b/src/iter.rs index 3b81f07..4077808 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -4,6 +4,7 @@ use { }; existential type PinIterator__Iter: Iterator; +existential type PinIterator__Map R, R>: PinIterator; pub trait PinIterator { type Item; @@ -26,6 +27,19 @@ pub trait PinIterator { P(self) } + + fn map(self, mut f: F) -> PinIterator__Map + where + Self: Sized, + F: FnMut(Self::Item) -> R, + { + #[ergo_pin] + gen_iter! { + for item in pin!(self).iter() { + yield f(item); + } + } + } } pub trait FusedPinIterator: PinIterator { @@ -38,18 +52,3 @@ impl PinIterator for Pin<&mut P> { Pin::get_mut(self).as_mut().next() } } - -// TODO: This should be a provided method on `PinIterator`, but existential -// types + closures don't mix well currently. -pub fn map(iter: I, mut f: F) -> impl PinIterator -where - I: PinIterator, - F: FnMut(I::Item) -> R, -{ - #[ergo_pin] - gen_iter! { - for item in pin!(iter).iter() { - yield f(item); - } - } -}