| 136 | |
| 137 | |
| 138 | class Visitor: |
| 139 | def __init__(self, fil, rec, ignore, bf, sort): |
| 140 | if isinstance(fil, (str, bytes)): |
| 141 | fil = FNMatcher(fil) |
| 142 | if isinstance(rec, str): |
| 143 | self.rec: Callable[[LocalPath], bool] = FNMatcher(rec) |
| 144 | elif not hasattr(rec, class="st">"__call__") and rec: |
| 145 | self.rec = lambda path: True |
| 146 | else: |
| 147 | self.rec = rec |
| 148 | self.fil = fil |
| 149 | self.ignore = ignore |
| 150 | self.breadthfirst = bf |
| 151 | self.optsort = cast(Callable[[Any], Any], sorted) if sort else (lambda x: x) |
| 152 | |
| 153 | def gen(self, path): |
| 154 | try: |
| 155 | entries = path.listdir() |
| 156 | except self.ignore: |
| 157 | return |
| 158 | rec = self.rec |
| 159 | dirs = self.optsort( |
| 160 | [p for p in entries if p.check(dir=1) and (rec is None or rec(p))] |
| 161 | ) |
| 162 | if not self.breadthfirst: |
| 163 | for subdir in dirs: |
| 164 | yield from self.gen(subdir) |
| 165 | for p in self.optsort(entries): |
| 166 | if self.fil is None or self.fil(p): |
| 167 | yield p |
| 168 | if self.breadthfirst: |
| 169 | for subdir in dirs: |
| 170 | yield from self.gen(subdir) |
| 171 | |
| 172 | |
| 173 | class FNMatcher: |