feat(wpcarro/emacs): Support struct-update!
Support mutable variant of `struct-update`. Also remove the `dash` dependency in `tests.el`. Change-Id: I76fc809e96b7cbbd3b39fd16db339cb62eab002c Reviewed-on: https://cl.tvl.fyi/c/depot/+/6027 Reviewed-by: wpcarro <wpcarro@gmail.com> Autosubmit: wpcarro <wpcarro@gmail.com> Tested-by: BuildkiteCI
This commit is contained in:
		
							parent
							
								
									9d475c5b9b
								
							
						
					
					
						commit
						44f520ccd1
					
				
					 3 changed files with 41 additions and 12 deletions
				
			
		|  | @ -16,7 +16,6 @@ let | |||
|     { }; | ||||
| 
 | ||||
|   emacs = (pkgs.emacsPackagesFor pkgs.emacs28).emacsWithPackages (epkgs: [ | ||||
|     epkgs.dash | ||||
|     struct | ||||
|   ]); | ||||
| in | ||||
|  |  | |||
|  | @ -39,6 +39,16 @@ This is immutable." | |||
|        (setf (,accessor copy) (funcall ,f (,accessor copy))) | ||||
|        copy))) | ||||
| 
 | ||||
| (defmacro struct-update! (type field f xs) | ||||
|   "Mutably apply F to FIELD in XS." | ||||
|   (let ((accessor (->> field | ||||
|                        symbol-name | ||||
|                        (s-prepend (s-concat (symbol-name type) "-")) | ||||
|                        intern))) | ||||
|     `(progn | ||||
|        (setf (,accessor ,xs) (funcall ,f (,accessor ,xs))) | ||||
|        ,xs))) | ||||
| 
 | ||||
| (defmacro struct-set (type field x xs) | ||||
|   "Immutably set FIELD in XS (struct TYPE) to X." | ||||
|   (let ((copier (->> type | ||||
|  |  | |||
|  | @ -3,22 +3,42 @@ | |||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| 
 | ||||
| (require 'ert) | ||||
| (require 'dash) | ||||
| (require 'struct) | ||||
| 
 | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| ;; Tests | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| 
 | ||||
| (ert-deftest struct-set! () | ||||
|   (cl-defstruct dummy name age) | ||||
|   (defvar struct--test-dummy (make-dummy :name "Roofus" :age 19)) | ||||
|   (struct-set! dummy name "Doofus" struct--test-dummy) | ||||
|   (should (string= "Doofus" (dummy-name struct--test-dummy)))) | ||||
| (cl-defstruct dummy name age) | ||||
| 
 | ||||
| (ert-deftest struct-update () | ||||
|   (let* ((test (make-dummy :name "Roofus" :age 19)) | ||||
|          (result (struct-update dummy name #'upcase test))) | ||||
|     ;; test | ||||
|     (should (string= "Roofus" (dummy-name test))) | ||||
|     (should (= 19 (dummy-age test))) | ||||
|     ;; result | ||||
|     (should (string= "ROOFUS" (dummy-name result))) | ||||
|     (should (= 19 (dummy-age result))))) | ||||
| 
 | ||||
| (ert-deftest struct-update! () | ||||
|   (let ((test (make-dummy :name "Roofus" :age 19))) | ||||
|     (struct-update! dummy name #'upcase test) | ||||
|     (should (string= "ROOFUS" (dummy-name test))) | ||||
|     (should (= 19 (dummy-age test))))) | ||||
| 
 | ||||
| (ert-deftest struct-set () | ||||
|   (cl-defstruct dummy name age) | ||||
|   (defvar struct--test-dummy (make-dummy :name "Roofus" :age 19)) | ||||
|   (let ((result (struct-set dummy name "Shoofus" struct--test-dummy))) | ||||
|     (should (string= "Roofus" (dummy-name struct--test-dummy))) | ||||
|     (should (string= "Shoofus" (dummy-name result))))) | ||||
|   (let* ((test (make-dummy :name "Roofus" :age 19)) | ||||
|          (result (struct-set dummy name "Shoofus" test))) | ||||
|     ;; test | ||||
|     (should (string= "Roofus" (dummy-name test))) | ||||
|     (should (= 19 (dummy-age test))) | ||||
|     ;; result | ||||
|     (should (string= "Shoofus" (dummy-name result))) | ||||
|     (should (= 19 (dummy-age result))))) | ||||
| 
 | ||||
| (ert-deftest struct-set! () | ||||
|   (let ((test (make-dummy :name "Roofus" :age 19))) | ||||
|     (struct-set! dummy name "Doofus" test) | ||||
|     (should (string= "Doofus" (dummy-name test))) | ||||
|     (should (= 19 (dummy-age test))))) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue