[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/taxy f115919 06/39: Add: taxy-copy and reverse args to
From: |
ELPA Syncer |
Subject: |
[elpa] externals/taxy f115919 06/39: Add: taxy-copy and reverse args to taxy-fill |
Date: |
Fri, 27 Aug 2021 10:57:30 -0400 (EDT) |
branch: externals/taxy
commit f11591987a84228a00f656d41334e70020825dab
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>
Add: taxy-copy and reverse args to taxy-fill
Now it works well in thread-last or ->>.
---
README.org | 57 +++++++++++++++++++++++++++++++--------------------------
taxy.el | 12 +++++++++++-
2 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/README.org b/README.org
index b1c46a6..c06b0f4 100644
--- a/README.org
+++ b/README.org
@@ -70,7 +70,7 @@ You might think about how to produce that by writing some
imperative code, but =
:predicate (lambda (n) (zerop
(mod n 5)))
:then #'identity))))))
(numbers (cl-loop for i below 100 collect i)))
- (taxy-simple (taxy-fill numbery (reverse numbers))))
+ (taxy-simple (taxy-fill (reverse numbers) numbery)))
#+END_SRC
The ~taxy-fill~ function applies the numbers in a "cascade" down the hierarchy
of "taxys", and the ~taxy-simple~ function returns a meaningful subset of the
taxys' slots, suitable for display.
@@ -125,11 +125,11 @@ A taxy is defined with the ~make-taxy~ constructor, like:
:taxys (list ...))
#+END_SRC
-The ~:predicate~ function determines whether an object fits into that taxy.
If it does, ~taxy-fill~ adds the object to that taxy's descendant ~:taxys~, if
present, or to its own ~objects~. The function defaults to ~identity~, so a
taxy "takes in" any object by default (i.e. if you only apply objects you want
to classify, there's no need to test them at the top-level taxy).
+The ~:predicate~ function determines whether an object fits into that taxy.
If it does, ~taxy-fill~ adds the object to that taxy's descendant ~:taxys~, if
present, or to its own ~:objects~. The function defaults to ~identity~, so a
taxy "takes in" any object by default (i.e. if you only apply objects you want
to classify, there's no need to test them at the top-level taxy).
The ~:then~ function determines what happens to an object after being taken
in: if the function, called with the object, returns a non-nil value, that
value is applied to other taxys at the same level until one of their ~:then~
functions returns nil or no more taxys remain. The function defaults to
~ignore~, which makes a taxy "consume" its objects by default. Setting the
function to, e.g. ~identity~, makes it not consume them, leaving them eligible
to also be taken into subsequent tax [...]
-After defining a taxy, call ~taxy-fill~ with it and a list of objects to fill
the taxy's hierarchy.
+After defining a taxy, call ~taxy-fill~ with it and a list of objects to fill
the taxy's hierarchy. *Note:* ~taxy-fill~ modifies the taxy given to it
(filling its ~:objects~ and those of its ~:taxys~), so when using a statically
defined taxy (e.g. one defined with ~defvar~), you should pass ~taxy-fill~ a
taxy copied with ~taxy-copy~, which recursively copies a taxy without
~:objects~.
To return a taxy in a more human-readable format (with only relevant fields
included), use ~taxy-simple~.
@@ -138,29 +138,34 @@ To return a taxy in a more human-readable format (with
only relevant fields incl
You may not always know in advance what taxonomy a set of objects fits into,
so =taxy= lets you add taxys dynamically by using the ~:take~ function to add a
taxy when an object is "taken into" a parent taxy. For example, you could
dynamically classify buffers by their major mode like so:
#+BEGIN_SRC elisp :exports code
- (let* ((key-fn (lambda (buffer)
- (buffer-local-value 'major-mode buffer)))
- (buffery
- (make-taxy
- :name "Buffers"
- :taxys (list
- (make-taxy
- :name "Modes"
- :take (lambda (buffer taxy)
- (let* ((key (funcall key-fn buffer))
- (key-taxy
- (or (cl-find-if (lambda (taxy-key)
- (equal key taxy-key))
- (taxy-taxys taxy)
- :key #'taxy-key)
- (car
- (push (make-taxy
- :name key :key key
- :predicate (lambda (buffer)
- (equal key
(funcall key-fn buffer))))
- (taxy-taxys taxy))))))
- (push buffer (taxy-objects key-taxy)))))))))
- (taxy-simple (taxy-fill buffery (buffer-list))))
+ (defun buffery-major-mode (buffer)
+ (buffer-local-value 'major-mode buffer))
+
+ (defvar buffery
+ (make-taxy
+ :name "Buffers"
+ :taxys (list
+ (make-taxy
+ :name "Modes"
+ :take (lambda (buffer taxy)
+ (let* ((key (buffery-major-mode buffer))
+ (key-taxy
+ (or (cl-find-if (lambda (taxy-key)
+ (equal key taxy-key))
+ (taxy-taxys taxy)
+ :key #'taxy-key)
+ (car
+ (push (make-taxy
+ :name key :key key
+ :predicate (lambda (buffer)
+ (equal key
(buffery-major-mode buffer))))
+ (taxy-taxys taxy))))))
+ (push buffer (taxy-objects key-taxy))))))))
+
+ ;; Note the use of `taxy-copy' to avoid mutating the original taxy
definition.
+ (taxy-simple
+ (taxy-fill (buffer-list)
+ (taxy-copy buffery)))
#+END_SRC
Which produces this taxonomy of buffers:
diff --git a/taxy.el b/taxy.el
index 4f538c5..115beca 100644
--- a/taxy.el
+++ b/taxy.el
@@ -46,7 +46,8 @@
;;;; Functions
-(defun taxy-fill (taxy objects)
+(defun taxy-fill (objects taxy)
+ "Fill TAXY with OBJECTS according to its definition."
(cl-labels ((apply-object (taxy object)
(cl-loop for taxy in (taxy-taxys taxy)
when (funcall (taxy-predicate taxy)
object)
@@ -67,12 +68,21 @@
(apply-object taxy object))))
(defun taxy-simple (taxy)
+ "Return a list of the human-readable parts of TAXY."
(delq nil
(list (taxy-name taxy)
(taxy-description taxy)
(taxy-objects taxy)
(mapcar #'taxy-simple (taxy-taxys taxy)))))
+(defun taxy-copy (taxy)
+ "Return a copy of TAXY without objects.
+Clears TAXY's objects and those of its descendant taxys."
+ (setf taxy (copy-taxy taxy)
+ (taxy-objects taxy) nil
+ (taxy-taxys taxy) (mapcar #'taxy-copy (taxy-taxys taxy)))
+ taxy)
+
;;;; Footer
(provide 'taxy)
- [elpa] externals/taxy 0a57638 17/39: Docs: Mention threading macros, (continued)
- [elpa] externals/taxy 0a57638 17/39: Docs: Mention threading macros, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 0dce844 16/39: Docs: Add example of incremental filling, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy e09dc38 32/39: Add: (taxy-mapc*) And musicy.el example, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy bd28836 24/39: Meta: Headers, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy f0b926f 34/39: Add: Diredy example, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 21e6fa6 22/39: Docs: Commentary, header, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy e56ae33 26/39: Meta: .gitignore, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 15eb9b7 31/39: Docs: Tidy, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 01e956a 04/39: Rename function, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 657823b 03/39: Docs: Tidy example, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy f115919 06/39: Add: taxy-copy and reverse args to taxy-fill,
ELPA Syncer <=
- [elpa] externals/taxy a94ab1c 05/39: Tidy, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 751e9d7 08/39: Show reusable taxys, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy d355d3a 14/39: Docs: Add mascot, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 3b253a6 21/39: Tidy: (taxy-fill) Argument order in labeled function, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy f5458d0 29/39: Change: taxy-map -> taxy-mapcar, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 35c8f61 33/39: Add: (taxy-magit-section-indent), ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 4686e03 36/39: Add: (taxy-size), ELPA Syncer, 2021/08/27
- [elpa] externals/taxy 34aa94d 23/39: Add: taxy-magit-section, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy a17e540 35/39: Docs: Show examples, ELPA Syncer, 2021/08/27
- [elpa] externals/taxy aa0fe08 20/39: Change: taxy-copy -> taxy-emptied, ELPA Syncer, 2021/08/27