"a/e/g" make-directory
"a/e/g/e" touch-file
- "**" glob-directory natural-sort
- "**/" glob-directory natural-sort
- "**/*" glob-directory natural-sort
- "**/**" glob-directory natural-sort
- "**/b" glob-directory natural-sort
- "**/e" glob-directory natural-sort
- ! "**//e" glob-directory natural-sort
- ! "**/**/e" glob-directory natural-sort
- "**/e/**" glob-directory natural-sort
- "a/**" glob-directory natural-sort
+ "**" glob natural-sort
+ "**/" glob natural-sort
+ "**/*" glob natural-sort
+ "**/**" glob natural-sort
+ "**/b" glob natural-sort
+ "**/e" glob natural-sort
+ ! "**//e" glob natural-sort
+ ! "**/**/e" glob natural-sort
+ "**/e/**" glob natural-sort
+ "a/**" glob natural-sort
] with-test-directory
] unit-test
! TODO: make case-fold an option, off by default
! TODO: maybe make case-fold an option on regexp
-DEFER: glob-directory%
+DEFER: glob%
: glob-entries ( path -- entries )
directory-entries [ name>> "." head? ] reject ;
-: ?glob-directory% ( root remaining entry -- )
+: ?glob% ( root remaining entry -- )
over empty? [
2drop ,
] [
- directory? [ glob-directory% ] [ 2drop ] if
+ directory? [ glob% ] [ 2drop ] if
] if ;
:: glob-wildcard% ( root globs -- )
dup ,
] [
entry directory? [
- dupd glob-directory%
+ dupd glob%
] [
drop
] if
} cond
{ [ entry directory? ] [ next-glob ] } 0&& [
- globs glob-directory%
+ globs glob%
] [
drop
] if
root glob-entries [| entry |
entry name>> >case-fold glob matches? [
root entry name>> append-path
- remaining entry ?glob-directory%
+ remaining entry ?glob%
] when
] each ;
globs unclip :> ( remaining glob )
root glob append-path dup exists? [
- remaining over file-info ?glob-directory%
+ remaining over file-info ?glob%
] [
drop
] if ;
-: glob-directory% ( root globs -- )
+: glob% ( root globs -- )
dup ?first {
{ f [ 2drop ] }
{ "**" [ glob-wildcard% ] }
PRIVATE>
-: glob-directory ( glob -- files )
- glob-path [ glob-directory% ] { } make ;
+: glob ( glob -- files )
+ glob-path [ glob% ] { } make ;