[Timeline] Add some abstraction

This commit is contained in:
Daniel - 2018-02-19 10:21:35 +01:00
parent 5d446edd29
commit 55827f5d6c
Signed by: dbo
GPG Key ID: 4F63DB96D45AA9C6
1 changed files with 32 additions and 15 deletions

View File

@ -33,6 +33,18 @@ Filter are applied in the order they are given in this list."
:group 'timeline-tools :group 'timeline-tools
:type '(list function)) :type '(list function))
;; Model
(defalias 'timeline-tools-entry-start-time 'car
"Start time of ENTRY.")
(defalias 'timeline-tools-entry-end-time 'cadr
"End time of ENTRY.")
(defalias 'timeline-tools-entry-marker 'caddr
"Marker to org task of ENTRY.")
;; Utilities ;; Utilities
@ -203,7 +215,9 @@ FILES defaults to `org-agenda-files including all archives."
turned-around-timeline))) turned-around-timeline)))
(sort turned-around-timeline (sort turned-around-timeline
(lambda (entry-1 entry-2) (lambda (entry-1 entry-2)
(< (car entry-1) (car entry-2)))))) (< (timeline-tools-entry-start-time entry-1)
(timeline-tools-entry-start-time entry-2))))))
(defun timeline-tools-get-category-at-marker (marker) (defun timeline-tools-get-category-at-marker (marker)
"Return ARCHIVE_CATEGORY or CATEGORY at position given by MARKER. "Return ARCHIVE_CATEGORY or CATEGORY at position given by MARKER.
Return whatever is found first." Return whatever is found first."
@ -218,9 +232,9 @@ Markers to org mode tasks are combined into a list."
(timeline-tools-get-category-at-marker marker))) (timeline-tools-get-category-at-marker marker)))
timeline))) timeline)))
(mapcar (lambda (cluster) (mapcar (lambda (cluster)
(list (car (car cluster)) ; start of first entry (list (timeline-tools-entry-start-time (-first-item cluster))
(cadr (car (last cluster))) ; end of last entry (timeline-tools-entry-end-time (-last-item cluster))
(mapcar #'third cluster))) (mapcar #'timeline-tools-entry-marker cluster)))
new-timeline))) new-timeline)))
(defun timeline-tools-skip-short-entries (timeline) (defun timeline-tools-skip-short-entries (timeline)
@ -228,32 +242,35 @@ Markers to org mode tasks are combined into a list."
A slot is short if it is not longer than THRESHOLD seconds. A slot is short if it is not longer than THRESHOLD seconds.
Resulting gaps are distributed evenly among adjacent slots." Resulting gaps are distributed evenly among adjacent slots."
(let ((start (car (car timeline))) (let ((start (timeline-tools-entry-start-time (-first-item timeline)))
(end (cadr (car (last timeline)))) (end (timeline-tools-entry-end-time (-last-item timeline)))
new-timeline) new-timeline)
;; remove all slots that are too short ;; remove all slots that are too short
(setq new-timeline (setq new-timeline
(cl-remove-if (lambda (entry) (cl-remove-if (lambda (entry)
(<= (- (cadr entry) (car entry)) (<= (- (timeline-tools-entry-end-time entry)
(timeline-tools-entry-start-time entry))
timeline-tools-short-task-threshold)) timeline-tools-short-task-threshold))
timeline)) timeline))
;; reset start and end times ;; reset start and end times
(setf (car (car new-timeline)) start) (setf (timeline-tools-entry-start-time (-first-item new-timeline)) start)
(setf (cadr (car (last new-timeline))) end) (setf (timeline-tools-entry-end-time (-last-item new-timeline)) end)
;; distribute gaps evenly among adjacent slots ;; distribute gaps evenly among adjacent slots
(cl-do (cl-do
((sub-timeline new-timeline (cdr sub-timeline))) ((sub-timeline new-timeline (cdr sub-timeline)))
((null (cdr sub-timeline))) ((null (cdr sub-timeline)))
(let* ((entry-1 (car sub-timeline)) (let* ((entry-1 (-first-item sub-timeline))
(entry-2 (cadr sub-timeline)) (entry-2 (-second-item sub-timeline))
(end-1 (cadr entry-1)) (end-1 (timeline-tools-entry-end-time entry-1))
(start-2 (car entry-2))) (start-2 (timeline-tools-entry-start-time entry-2)))
(when (not (= end-1 start-2)) (when (not (= end-1 start-2))
(let ((middle (/ (+ end-1 start-2) 2))) (let ((middle (/ (+ end-1 start-2) 2)))
(setf (cadr entry-1) middle) (setf (timeline-tools-entry-end-time entry-1) middle)
(setf (car entry-2) middle))))) (setf (timeline-tools-entry-start-time entry-2) middle)))))
new-timeline)) new-timeline))
;;;###autoload ;;;###autoload