diff options
author | Sean Whitton <spwhitton@spwhitton.name> | 2021-03-18 09:44:21 -0700 |
---|---|---|
committer | Sean Whitton <spwhitton@spwhitton.name> | 2021-03-18 09:55:57 -0700 |
commit | 20de275d39fdf56e14078fb8a816f96f2314562f (patch) | |
tree | a67b7ba6366051eb06bd61d5fc6d832db5df5fdf /src/propspec.lisp | |
parent | 966ee4cf86635ce89af217ae3b8106b0a67b2f49 (diff) | |
download | consfigurator-20de275d39fdf56e14078fb8a816f96f2314562f.tar.gz |
attempt to reintroduce ON-CHANGE
Signed-off-by: Sean Whitton <spwhitton@spwhitton.name>
Diffstat (limited to 'src/propspec.lisp')
-rw-r--r-- | src/propspec.lisp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/propspec.lisp b/src/propspec.lisp index 0044d52..5df0410 100644 --- a/src/propspec.lisp +++ b/src/propspec.lisp @@ -330,3 +330,26 @@ apply the elements of REQUIREMENTS in reverse order." :unapply (get psym 'papply) :args args))) +(defmacro on-change (propapp &body on-change) + "If applying PROPAPP makes a change, also apply each of of the propapps +ON-CHANGE in order." + `(on-change* ,propapp ,@on-change)) + +(define-function-property-combinator on-change* (propapp &rest propapps) + (:retprop :type (collapse-types (propapptype propapp) + (mapcar #'propapptype propapps)) + :desc (get (car propapp) 'desc) + :hostattrs (lambda (&rest args) + (apply #'propattrs (car propapp) args)) + :check (get (car propapp) 'check) + :apply (lambda (&rest args) + (unless (eq (propappapply (cons (car propapp) args)) + :no-change) + (dolist (propapp propapps) + (propappapply propapp)))) + :unapply (lambda (&rest args) + (unless (eq (propappunapply (cons (car propapp) args)) + :no-change) + (dolist (propapp (reverse propapps)) + (propappunapply propapp)))) + :args (cdr propapp))) |