From 90b121d53c48ce642e52f772a3f73e9ca9f9ae1a Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Fri, 15 Jan 2021 16:52:30 +0100 Subject: [PATCH] ambrevar/file: Add walk+mime, finder+mime. --- .../share/common-lisp/source/ambrevar/file.lisp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.local/share/common-lisp/source/ambrevar/file.lisp b/.local/share/common-lisp/source/ambrevar/file.lisp index 416c86d5..94e540a5 100644 --- a/.local/share/common-lisp/source/ambrevar/file.lisp +++ b/.local/share/common-lisp/source/ambrevar/file.lisp @@ -130,6 +130,10 @@ Second value is the list of directories, third value is the non-directories." (defvar *finder-include-directories* t "When non-nil `walk' include directories.") +(export-always '*finder-constructor*) +(defvar *finder-constructor* #'file + "Function that takes a path and returns a `file'-like object.") + (export-always 'walk) (defun walk (root &rest predicates) "List FILES (including directories) that satisfy all PREDICATES. @@ -140,8 +144,9 @@ Without PREDICATES, list all files." (constantly t) (constantly t) (lambda (subdirectory) (setf result (nconc result - (let ((subfiles (mapcar #'file (append (if *finder-include-directories* (list subdirectory) nil) - (uiop:directory-files subdirectory))))) + (let ((subfiles (mapcar *finder-constructor* + (append (if *finder-include-directories* (list subdirectory) nil) + (uiop:directory-files subdirectory))))) (if predicates (delete-if (lambda (file) (notany (lambda (pred) (funcall pred file)) @@ -215,3 +220,11 @@ See `%description'." (defun file+mime (path) (make-instance 'file+mime :path path)) + +(defun walk+mime (root &rest predicates) + (let ((*finder-constructor* #'file+mime)) + (apply #'walk root predicates))) + +(defun finder+mime (root &rest predicates) + (let ((*finder-constructor* #'file+mime)) + (apply #'finder root predicates)))