1 USING: io.files kernel sequences accessors
2 dlists dequeues arrays sequences.lib ;
5 TUPLE: directory-iterator path bfs queue ;
7 : qualified-directory ( path -- seq )
8 dup directory [ first2 >r append-path r> 2array ] with map ;
10 : push-directory ( path iter -- )
11 >r qualified-directory r> [
12 dup queue>> swap bfs>>
13 [ push-front ] [ push-back ] if
16 : <directory-iterator> ( path bfs? -- iterator )
17 <dlist> directory-iterator boa
18 dup path>> over push-directory ;
20 : next-file ( iter -- file/f )
21 dup queue>> dequeue-empty? [ drop f ] [
22 dup queue>> pop-back first2
23 [ over push-directory next-file ] [ nip ] if
26 : iterate-directory ( iter quot -- obj )
27 2dup >r >r >r next-file dup [
31 drop r> r> iterate-directory
37 : find-file ( path bfs? quot -- path/f )
38 >r <directory-iterator> r>
39 [ keep and ] curry iterate-directory ; inline
41 : each-file ( path bfs? quot -- )
42 >r <directory-iterator> r>
43 [ f ] compose iterate-directory drop ; inline
45 : find-all-files ( path bfs? quot -- paths )
46 >r <directory-iterator> r>
47 pusher >r [ f ] compose iterate-directory drop r> ; inline
49 : recursive-directory ( path bfs? -- paths )
50 [ ] accumulator >r each-file r> ;