io.directories.search: Add find-up-to-root combinator and helper words.

Example:  "c:\\factor64\\.git\\objects" [ ".txt" tail? ] find-up-to-root .
"c:\\factor64\\.git"
db4
Doug Coleman 2015-05-05 23:26:52 -07:00
parent 59205b0399
commit 510f605df9
1 changed files with 32 additions and 0 deletions

View File

@ -87,13 +87,45 @@ ERROR: file-not-found path bfs? quot ;
: find-file-throws ( path bfs? quot -- path )
3dup find-file dup [ 2nip nip ] [ drop file-not-found ] if ; inline
ERROR: sequence-expected obj ;
: ensure-sequence-of-directories ( obj -- seq )
dup string? [ 1array ] when
dup sequence? [ sequence-expected ] unless ;
! Can't make this generic# on string/sequence because of combinators
: find-in-directories ( directories bfs? quot -- path'/f )
[ ensure-sequence-of-directories ] 2dip
'[ _ [ _ _ find-file-throws ] attempt-all ]
[ drop f ] recover ; inline
: find-all-in-directories ( directories quot -- paths/f )
'[ _ find-all-files ] map concat ; inline
: ?parent-directory ( path -- path'/f )
dup parent-directory 2dup = [ 2drop f ] [ nip ] if ;
: ?file-info ( path -- file-info/f )
[ file-info ] [ 2drop f ] recover ;
: containing-directory ( path -- path' )
dup ?file-info directory? [ parent-directory ] when ;
: ?qualified-directory-files ( path -- seq )
[ qualified-directory-files ]
[ drop ?parent-directory [ ?qualified-directory-files ] [ f ] if* ] recover ;
: (find-up-to-root) ( path quot -- obj )
2dup [ ?qualified-directory-files ] dip find swap [
2nip
] [
drop [ ?parent-directory ] dip over
[ (find-up-to-root) ] [ 2drop f ] if
] if ; inline
: find-up-to-root ( path quot -- obj )
[ normalize-path containing-directory ] dip (find-up-to-root) ; inline
: link-size/0 ( path -- n )
[ link-info size-on-disk>> ] [ 2drop 0 ] recover ;