From 2b4c3a2d7a378978ed7bd4366f8c5eac8578ff30 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Fri, 18 Oct 2024 03:04:08 +0100 Subject: [PATCH] feat(core): add siren list manipulation helper functions --- core/siren-core-utils.el | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/core/siren-core-utils.el b/core/siren-core-utils.el index 9dea85f..3eb6cd9 100644 --- a/core/siren-core-utils.el +++ b/core/siren-core-utils.el @@ -15,6 +15,46 @@ "Add ELEMENT to end of LIST-VAR, removing duplicates." `(setq ,list-var (append (remove ,element ,list-var) (list ,element)))) +(defmacro siren-add-before (list-var element needle) + "Add ELEMENT before NEEDLE in LIST-VAR, without removing duplicates." + `(let ((pos (cl-position ,needle ,list-var))) + (if pos + (setq ,list-var (append (cl-subseq ,list-var 0 pos) + (list ,element) + (cl-subseq ,list-var pos))) + (setq ,list-var (append ,list-var (list ,element)))))) + +(defmacro siren-add-after (list-var element needle) + "Add ELEMENT after NEEDLE in LIST-VAR, without removing duplicates." + `(let ((pos (cl-position ,needle ,list-var))) + (if pos + (setq ,list-var (append (cl-subseq ,list-var 0 (1+ pos)) + (list ,element) + (cl-subseq ,list-var (1+ pos)))) + (setq ,list-var (append ,list-var (list ,element)))))) + +(defmacro siren-ensure-before (list-var element needle) + "Add ELEMENT before NEEDLE in LIST-VAR, removing duplicates." + `(let* ((cleaned-list (remove ,element ,list-var)) + (pos (cl-position ,needle cleaned-list))) + (setq ,list-var + (if pos + (append (cl-subseq cleaned-list 0 pos) + (list ,element) + (cl-subseq cleaned-list pos)) + (append cleaned-list (list ,element)))))) + +(defmacro siren-ensure-after (list-var element needle) + "Add ELEMENT after NEEDLE in LIST-VAR, removing duplicates." + `(let* ((cleaned-list (remove ,element ,list-var)) + (pos (cl-position ,needle cleaned-list))) + (setq ,list-var + (if pos + (append (cl-subseq cleaned-list 0 (1+ pos)) + (list ,element) + (cl-subseq cleaned-list (1+ pos))) + (append cleaned-list (list ,element)))))) + (defun siren-recursive-add-to-load-path (dir) "Add DIR and all its sub-directories to `load-path'." (add-to-list 'load-path dir)