From 8d0ecf6a760e5766fdbc8effcf785d0e848354b8 Mon Sep 17 00:00:00 2001 From: Pierre Neidhardt Date: Fri, 15 Jan 2021 13:38:13 +0100 Subject: [PATCH] ambrevar: Move walk and finder from shell to file. --- .../common-lisp/source/ambrevar/file.lisp | 31 +++++++++++++++++++ .../common-lisp/source/ambrevar/shell.lisp | 31 ------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.local/share/common-lisp/source/ambrevar/file.lisp b/.local/share/common-lisp/source/ambrevar/file.lisp index 30e99204..f326a842 100644 --- a/.local/share/common-lisp/source/ambrevar/file.lisp +++ b/.local/share/common-lisp/source/ambrevar/file.lisp @@ -102,3 +102,34 @@ This returns the directory name for directories." :modification-date (local-time:unix-to-timestamp (osicat-posix:stat-mtime stat)) :access-date (local-time:unix-to-timestamp (osicat-posix:stat-atime stat)) :permissions (stat-permissions stat)))))) + +(export-always '*finder-include-directories*) +(defvar *finder-include-directories* t + "When non-nil `walk' include directories.") + +(export-always 'walk) +(defun walk (root &rest predicates) + "List FILES (including directories) that satisfy all PREDICATES. +Without PREDICATES, list all files." + (let ((result '())) + (uiop:collect-sub*directories + (uiop:ensure-directory-pathname root) + (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))))) + (if predicates + (delete-if (lambda (file) + (notany (lambda (pred) (funcall pred file)) + predicates)) + subfiles) + subfiles)))))) + result)) + +(export-always 'finder) +(defun finder (root &rest predicates) + "List files in ROOT that satisfy all PREDICATES. +Without PREDICATES, list all files." + (let ((*finder-include-directories* nil)) + (apply #'walk root predicates))) diff --git a/.local/share/common-lisp/source/ambrevar/shell.lisp b/.local/share/common-lisp/source/ambrevar/shell.lisp index 227c1572..c7500ffa 100644 --- a/.local/share/common-lisp/source/ambrevar/shell.lisp +++ b/.local/share/common-lisp/source/ambrevar/shell.lisp @@ -108,10 +108,6 @@ Useful for `walk'." (lambda (file) (ppcre:scan "application/x-sharedlib" (first (file-mime-type file))))) -(export-always '*finder-include-directories*) -(defvar *finder-include-directories* t - "When non-nil `walk' include directories.") - (export-always 'directory-listing) ; TODO: Rename list-directory? (defun directory-listing (path &key sort?) "Return entries in PATH. @@ -124,33 +120,6 @@ If SORT?, sort them alphabetically." (sort result #'string< :key #'namestring) result))) -(export-always 'walk) -(defun walk (root &rest predicates) - "List files and directories that satisfy all PREDICATES. -Without PREDICATES, list all files." - (let ((result '())) - (uiop:collect-sub*directories - (uiop:ensure-directory-pathname root) - (constantly t) (constantly t) - (lambda (subdirectory) - (setf result (nconc result - (let ((subfiles (append (if *finder-include-directories* (list subdirectory) nil) - (uiop:directory-files subdirectory)))) - (if predicates - (delete-if (lambda (file) - (notany (lambda (pred) (funcall pred file)) - predicates)) - subfiles) - subfiles)))))) - result)) - -(export-always 'finder) -(defun finder (root &rest predicates) - "List files in ROOT that satisfy all PREDICATES. -Without PREDICATES, list all files." - (let ((*finder-include-directories* nil)) - (apply #'walk root predicates))) - (export-always 'delete-empty-directory-upward) (defun delete-empty-directory-upward (directory) "Delete directory and its parents until non-empty.