about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe 8472 <git@infinite-source.de>2025-06-15 21:47:48 +0200
committerThe 8472 <git@infinite-source.de>2025-06-15 22:40:44 +0200
commite6c300892dce9202e4f21359129569536945dfea (patch)
tree2fd2269ac810de45f8e08096d3d8cff6a8a92f39
parent75e7cf5f85aad82331a38deff24845b63eaf30f3 (diff)
downloadrust-e6c300892dce9202e4f21359129569536945dfea.tar.gz
rust-e6c300892dce9202e4f21359129569536945dfea.zip
small iter.intersperse.fold() optimization
No need to call into fold when the first item is already None,
this avoids some redundant work for empty iterators.

"But it uses Fuse" one might want to protest, but Fuse is specialized
and may call into the inner iterator anyway.

-rw-r--r--library/core/src/iter/adapters/intersperse.rs11
1 files changed, 10 insertions, 1 deletions
diff --git a/library/core/src/iter/adapters/intersperse.rs b/library/core/src/iter/adapters/intersperse.rs
index c97a59b614f..843479e2a27 100644
--- a/library/core/src/iter/adapters/intersperse.rs
+++ b/library/core/src/iter/adapters/intersperse.rs
@@ -223,7 +223,16 @@ where
 {
     let mut accum = init;
 
-    let first = if started { next_item.take() } else { iter.next() };
+    let first = if started {
+        next_item.take()
+    } else {
+        let n = iter.next();
+        // skip invoking fold() for empty iterators
+        if n.is_none() {
+            return accum;
+        }
+        n
+    };
     if let Some(x) = first {
         accum = f(accum, x);
     }