ADD reduction functions

This commit is contained in:
Nathan Dwarshuis 2022-02-09 20:23:41 -05:00
parent 175b3c0ed8
commit d81a2fc9b9
1 changed files with 34 additions and 9 deletions

View File

@ -709,20 +709,45 @@ FUTURE-LIMIT in a list."
(defmacro org-x-dag-ids-rank (form ids) (defmacro org-x-dag-ids-rank (form ids)
(declare (indent 1)) (declare (indent 1))
`(->> (--map (cons it ,form) ids) `(->> (--map (cons it ,form) ,ids)
(--sort (> (cdr it) (cdr other))))) (--sort (> (cdr it) (cdr other)))))
(defmacro org-x-dag-ids-rank-by-children (form ids) (defmacro org-x-dag-ids-rank-by-children (form ids)
(org-x-dag-ids-rank `(org-x-dag-ids-rank
(let ((it (org-x-dag-id->children it))) (let ((it (org-x-dag-id->children it)))
,form) ,form)
ids)) ,ids))
(defmacro org-x-dag-ids-rank-by-parents (form ids) (defmacro org-x-dag-ids-rank-by-parents (form ids)
(org-x-dag-ids-rank `(org-x-dag-ids-rank
(let ((it (org-x-dag-id->parents it))) (let ((it (org-x-dag-id->parents it)))
,form) ,form)
ids)) ,ids))
;; reductions
;; TODO this is a naive approach that will effectively expand the dag into
;; a tree for nodes that share common children/parents. I might want to handle
;; these special cases in a better way (example, 'summation' could count nodes
;; multiple times, which may or may not make sense)
(defmacro org-x-dag--id-reduce (id-getter branch-form leaf-form init id)
(declare (indent 1))
(let ((cs (make-symbol "--children")))
`(cl-labels
((reduce
(acc it)
(-if-let (,cs (,id-getter ,id))
(--reduce-from (reduce acc it) ,branch-form ,cs)
,leaf-form)))
(reduce ,init ,id))))
(defmacro org-x-dag-id-reduce-down (branch-form leaf-form init id)
`(org-x-dag--id-reduce org-x-dag-id->children
,branch-form ,leaf-form ,init ,id))
(defmacro org-x-dag-id-reduce-up (branch-form leaf-form init id)
`(org-x-dag--id-reduce org-x-dag-id->parents
,branch-form ,leaf-form ,init ,id))
;;; HEADLINE PREDICATES ;;; HEADLINE PREDICATES
;; ;;