44
55use Lkrms \Facade \Compute ;
66use Lkrms \Facade \Console ;
7- use Lkrms \Facade \File ;
87use Lkrms \Facade \Sys ;
98use Lkrms \Support \Iterator \Contract \FluentIteratorInterface ;
109use Lkrms \Utility \Convert ;
1110use Lkrms \Utility \Test ;
11+ use AppendIterator ;
1212use CallbackFilterIterator ;
1313use FilesystemIterator ;
1414use LogicException ;
@@ -30,6 +30,8 @@ final class Filesystem
3030 *
3131 * Exclusions are applied before inclusions.
3232 *
33+ * @param string|string[] $directory One or multiple directories to iterate
34+ * over.
3335 * @param string|null $exclude A regular expression that specifies paths to
3436 * exclude. No files are excluded if `null`.
3537 *
@@ -54,7 +56,7 @@ final class Filesystem
5456 * @return FluentIteratorInterface<string,SplFileInfo>
5557 */
5658 public function find (
57- string $ directory ,
59+ $ directory ,
5860 ?string $ exclude = null ,
5961 ?string $ include = null ,
6062 ?array $ excludeCallbacks = null ,
@@ -113,30 +115,37 @@ function (SplFileInfo $current, string $key) use (
113115 return !$ include && !$ includeCallbacks ;
114116 };
115117 }
116-
117- if ($ recursive ) {
118- $ iterator = new RecursiveDirectoryIterator ($ directory , $ flags );
119- if ($ callback ?? null ) {
120- $ iterator = new RecursiveCallbackFilterIterator ($ iterator , $ callback );
118+ /** @var AppendIterator|null */
119+ $ appendIterator = null ;
120+ /** @var non-empty-array<string> */
121+ $ directories = (array ) $ directory ;
122+ foreach ($ directories as $ directory ) {
123+ if ($ recursive ) {
124+ $ iterator = new RecursiveDirectoryIterator ($ directory , $ flags );
125+ if ($ callback ?? null ) {
126+ $ iterator = new RecursiveCallbackFilterIterator ($ iterator , $ callback );
127+ }
128+ $ iterator = new RecursiveIteratorIterator ($ iterator , $ mode );
129+ } else {
130+ $ iterator = new FilesystemIterator ($ directory , $ flags );
131+ if ($ callback ?? null ) {
132+ $ iterator = new CallbackFilterIterator ($ iterator , $ callback );
133+ }
134+ if (!$ withDirectories ) {
135+ $ iterator = new CallbackFilterIterator ($ iterator , fn (SplFileInfo $ current ) => !$ current ->isDir ());
136+ }
121137 }
122- $ iterator = new RecursiveIteratorIterator ($ iterator , $ mode );
123- /** @var FluentIteratorInterface<string,SplFileInfo> */
124- $ iterator = new \Lkrms \Support \Iterator \FluentIterator ($ iterator );
125138
126- return $ iterator ;
127- }
128-
129- $ iterator = new FilesystemIterator ($ directory , $ flags );
130- if ($ callback ?? null ) {
131- $ iterator = new CallbackFilterIterator ($ iterator , $ callback );
132- }
133- if (!$ withDirectories ) {
134- $ iterator = new CallbackFilterIterator ($ iterator , fn (SplFileInfo $ current ) => !$ current ->isDir ());
139+ if (!$ appendIterator ) {
140+ if (count ($ directories ) === 1 ) {
141+ break ;
142+ }
143+ $ appendIterator = new AppendIterator ();
144+ }
145+ $ appendIterator ->append ($ iterator );
135146 }
136- /** @var FluentIteratorInterface<string,SplFileInfo> */
137- $ iterator = new \Lkrms \Support \Iterator \FluentIterator ($ iterator );
138147
139- return $ iterator ;
148+ return new \ Lkrms \ Support \ Iterator \ FluentIterator ( $ appendIterator ?? $ iterator) ;
140149 }
141150
142151 /**
0 commit comments