Skip to content

Commit 1574bca

Browse files
committed
expose traverse and traverse_result; tag 0.0.18
1 parent 8732e70 commit 1574bca

File tree

5 files changed

+77
-10
lines changed

5 files changed

+77
-10
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
[package]
33
name = "im_ternary_tree"
4-
version = "0.0.17"
4+
version = "0.0.18"
55
edition = "2021"
66
authors = ["jiyinyiyong <jiyinyiyong@gmail.com>"]
77
license = "MIT"

benches/iterator.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::cell::RefCell;
2-
31
use criterion::{criterion_group, criterion_main, Criterion};
42

53
use im_ternary_tree::TernaryTreeList;
@@ -24,11 +22,11 @@ fn criterion_benchmark(c: &mut Criterion) {
2422
});
2523

2624
c.bench_function("traverse", |b| {
27-
let cc = RefCell::new(0);
25+
let mut cc = 0;
2826

2927
b.iter(|| {
30-
data.traverse(|item| {
31-
*cc.borrow_mut() += item;
28+
data.traverse(&mut |item| {
29+
cc += item;
3230
});
3331
})
3432
});

src/lib.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,10 +452,19 @@ where
452452
}
453453

454454
/// traverse all elements in list, use referenced value
455-
pub fn traverse(&self, f: impl Fn(&T)) {
455+
pub fn traverse(&self, f: &mut dyn FnMut(&T)) {
456456
match self {
457457
Empty => (),
458-
Tree(t) => t.traverse(&f),
458+
Tree(t) => t.traverse(f),
459+
}
460+
}
461+
462+
/// traverse elements in list, use referenced value,
463+
/// returns `Ok` when all elements are traversed
464+
pub fn traverse_result<S>(&self, f: &mut dyn FnMut(&T) -> Result<(), S>) -> Result<(), S> {
465+
match self {
466+
Empty => Ok(()),
467+
Tree(t) => t.traverse_result(f),
459468
}
460469
}
461470

src/tree.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1240,7 +1240,7 @@ where
12401240
xs
12411241
}
12421242

1243-
pub fn traverse(&self, f: &impl Fn(&T)) {
1243+
pub fn traverse(&self, f: &mut dyn FnMut(&T)) {
12441244
match self {
12451245
Leaf(value) => f(value),
12461246
Branch2 { left, middle, .. } => {
@@ -1255,6 +1255,23 @@ where
12551255
}
12561256
}
12571257

1258+
pub fn traverse_result<S>(&self, f: &mut dyn FnMut(&T) -> Result<(), S>) -> Result<(), S> {
1259+
match self {
1260+
Leaf(value) => f(value),
1261+
Branch2 { left, middle, .. } => {
1262+
left.traverse_result(f)?;
1263+
middle.traverse_result(f)?;
1264+
Ok(())
1265+
}
1266+
Branch3 { left, middle, right, .. } => {
1267+
left.traverse_result(f)?;
1268+
middle.traverse_result(f)?;
1269+
right.traverse_result(f)?;
1270+
Ok(())
1271+
}
1272+
}
1273+
}
1274+
12581275
pub fn iter(&self) -> TernaryTreeIterator<T> {
12591276
TernaryTreeIterator {
12601277
value: self,

tests/list_tests.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ fn iterator() -> Result<(), String> {
320320
}
321321

322322
#[test]
323-
fn traverse() -> Result<(), String> {
323+
fn iter_enum() -> Result<(), String> {
324324
let origin4 = [1, 2, 3, 4];
325325
let data4 = TernaryTreeList::from(&origin4);
326326

@@ -483,3 +483,46 @@ fn split_values() -> Result<(), String> {
483483

484484
Ok(())
485485
}
486+
487+
#[test]
488+
fn traverse() -> Result<(), String> {
489+
let n = 100;
490+
let mut data = TernaryTreeList::from(&[]);
491+
let mut total = 0;
492+
for idx in 0..n {
493+
data = data.append(idx);
494+
total += idx;
495+
}
496+
497+
let mut c = 0;
498+
499+
data.traverse(&mut |x| {
500+
c += x;
501+
});
502+
503+
assert_eq!(c, total);
504+
505+
Ok(())
506+
}
507+
508+
#[test]
509+
fn traverse_result() -> Result<(), String> {
510+
let n = 100;
511+
let mut data = TernaryTreeList::from(&[]);
512+
let mut total = 0;
513+
for idx in 0..n {
514+
data = data.append(idx);
515+
total += idx;
516+
}
517+
518+
let mut c = 0;
519+
520+
data.traverse_result::<String>(&mut |x| {
521+
c += x;
522+
Ok(())
523+
})?;
524+
525+
assert_eq!(c, total);
526+
527+
Ok(())
528+
}

0 commit comments

Comments
 (0)