Add parallel recursive directory iterator.

This adds a new walk type in the `ignore` crate, `WalkParallel`, which
provides a way for recursively iterating over a set of paths in parallel
while respecting various ignore rules.

The API is a bit strange, as a closure producing a closure isn't
something one often sees, but it does seem to work well.

This also allowed us to simplify much of the worker logic in ripgrep
proper, where MultiWorker is now gone.
This commit is contained in:
Andrew Gallant
2016-11-05 21:44:15 -04:00
parent 1aeae3e22d
commit b272be25fa
11 changed files with 1506 additions and 479 deletions

View File

@@ -137,6 +137,11 @@ impl Ignore {
self.0.parent.is_none()
}
/// Returns true if this matcher was added via the `add_parents` method.
pub fn is_absolute_parent(&self) -> bool {
self.0.is_absolute_parent
}
/// Return this matcher's parent, if one exists.
pub fn parent(&self) -> Option<Ignore> {
self.0.parent.clone()
@@ -376,7 +381,7 @@ impl Ignore {
}
/// Returns an iterator over parent ignore matchers, including this one.
fn parents(&self) -> Parents {
pub fn parents(&self) -> Parents {
Parents(Some(self))
}
@@ -387,7 +392,10 @@ impl Ignore {
}
}
struct Parents<'a>(Option<&'a Ignore>);
/// An iterator over all parents of an ignore matcher, including itself.
///
/// The lifetime `'a` refers to the lifetime of the initial `Ignore` matcher.
pub struct Parents<'a>(Option<&'a Ignore>);
impl<'a> Iterator for Parents<'a> {
type Item = &'a Ignore;