guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

09/35: emacs: Add 'guix-alist-put'.


From: Alex Kost
Subject: 09/35: emacs: Add 'guix-alist-put'.
Date: Fri, 11 Dec 2015 11:42:32 +0000

alezost pushed a commit to branch wip-refactor-emacs-ui
in repository guix.

commit 656d70653788b5a12d27f9740e6034c8e3214786
Author: Alex Kost <address@hidden>
Date:   Thu Nov 19 01:17:32 2015 +0300

    emacs: Add 'guix-alist-put'.
    
    * emacs/guix-utils.el (guix-alist-put, guix-alist-put-1)
      (guix-alist-put!): New procedures.
---
 emacs/guix-utils.el |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/emacs/guix-utils.el b/emacs/guix-utils.el
index 3748350..fbe0a61 100644
--- a/emacs/guix-utils.el
+++ b/emacs/guix-utils.el
@@ -307,7 +307,7 @@ Example:
        ,@body)))
 
 
-;;; Alist accessors
+;;; Alist procedures
 
 (defmacro guix-define-alist-accessor (name assoc-fun)
   "Define NAME function to access alist values using ASSOC-FUN."
@@ -325,6 +325,48 @@ accessed with KEYS."
 (guix-define-alist-accessor guix-assq-value assq)
 (guix-define-alist-accessor guix-assoc-value assoc)
 
+(defun guix-alist-put (value alist &rest keys)
+  "Put (add or replace if exists) VALUE to ALIST using KEYS.
+Return the new alist.
+
+ALIST is alist of alists of alists ... which can be consecutively
+accessed with KEYS.
+
+Example:
+
+  (guix-alist-put
+   'foo
+   '((one (a . 1) (b . 2))
+     (two (m . 7) (n . 8)))
+   'one 'b)
+
+  => ((one (a . 1) (b . foo))
+      (two (m . 7) (n . 8)))"
+  (or keys (error "Keys should be specified"))
+  (guix-alist-put-1 value alist keys))
+
+(defun guix-alist-put-1 (value alist keys)
+  "Subroutine of `guix-alist-put'."
+  (cond
+   ((null keys)
+    value)
+   ((null alist)
+    (list (cons (car keys)
+                (guix-alist-put-1 value nil (cdr keys)))))
+   ((eq (car keys) (caar alist))
+    (cons (cons (car keys)
+                (guix-alist-put-1 value (cdar alist) (cdr keys)))
+          (cdr alist)))
+   (t
+    (cons (car alist)
+          (guix-alist-put-1 value (cdr alist) keys)))))
+
+(defun guix-alist-put! (value variable &rest keys)
+  "Modify alist VARIABLE (symbol) by putting VALUE using KEYS.
+See `guix-alist-put' for details."
+  (set variable
+       (apply #'guix-alist-put value (symbol-value variable) keys)))
+
 
 ;;; Diff
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]