Skip to content

Commit 955f950

Browse files
committed
refactor: make ErasedSegment::recursive_crawl_all return Iterator instead of Vec
1 parent dbe8152 commit 955f950

File tree

2 files changed

+17
-18
lines changed
  • crates

2 files changed

+17
-18
lines changed

crates/lib-core/src/parser/segments/base.rs

+16-13
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,6 @@ impl ErasedSegment {
172172

173173
pub fn get_raw_segments(&self) -> Vec<ErasedSegment> {
174174
self.recursive_crawl_all(false)
175-
.into_iter()
176175
.filter(|it| it.segments().is_empty())
177176
.collect()
178177
}
@@ -618,22 +617,26 @@ impl ErasedSegment {
618617
)
619618
}
620619

621-
pub fn recursive_crawl_all(&self, reverse: bool) -> Vec<ErasedSegment> {
622-
let mut result = Vec::with_capacity(self.segments().len() + 1);
620+
pub fn recursive_crawl_all(&self, reverse: bool) -> impl Iterator<Item = ErasedSegment> + '_ {
621+
let self_clone = self.clone();
623622

624623
if reverse {
625-
for seg in self.segments().iter().rev() {
626-
result.append(&mut seg.recursive_crawl_all(reverse));
627-
}
628-
result.push(self.clone());
624+
Box::new(
625+
self.segments()
626+
.iter()
627+
.rev()
628+
.flat_map(move |seg| seg.recursive_crawl_all(reverse))
629+
.chain(std::iter::once(self_clone)),
630+
) as Box<dyn Iterator<Item = _>>
629631
} else {
630-
result.push(self.clone());
631-
for seg in self.segments() {
632-
result.append(&mut seg.recursive_crawl_all(reverse));
633-
}
632+
Box::new(
633+
std::iter::once(self_clone).chain(
634+
self.segments()
635+
.iter()
636+
.flat_map(move |seg| seg.recursive_crawl_all(reverse)),
637+
),
638+
) as Box<dyn Iterator<Item = _>>
634639
}
635-
636-
result
637640
}
638641

639642
pub fn raw_segments_with_ancestors(&self) -> &[(ErasedSegment, Vec<PathStep>)] {

crates/lib/src/rules/structure/st05.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -574,11 +574,7 @@ impl CTEBuilder {
574574
clone_map: &SegmentCloneMap,
575575
) {
576576
for (idx, cte) in enumerate(&self.ctes) {
577-
if cte
578-
.recursive_crawl_all(false)
579-
.into_iter()
580-
.any(|seg| segment.is(&seg))
581-
{
577+
if cte.recursive_crawl_all(false).any(|seg| segment.is(&seg)) {
582578
self.ctes[idx] = clone_map[&self.ctes[idx]].clone();
583579
return;
584580
}

0 commit comments

Comments
 (0)