Exercise log
The log is modeled as the function
\begin{equation*} f : D \to T, \end{equation*}where | \(d \in D\) | is the exercise day, |
measured in \(24\)-hour days from the Unix epoch; and | ||
\(t > 0 \in T\) | is the total exercise duration on day \(d\), | |
measured in seconds. |
\(f\) is computed, as a hash table, from Org Clock data by
(defun my-exercise-log ()
"Return a hash map with exercise durations per day."
(let ((lexical-binding t))
(save-window-excursion
(org-id-goto my-exercise-id)
(goto-char (org-log-beginning))
(named-let recur ((days (make-hash-table :test 'equal)))
(let ((element (org-element-at-point-no-context)))
(if (eq 'clock (org-element-type element))
(let* ((day (org-element-property :value element))
(day (org-format-timestamp day "%s"))
(day (string-to-number day))
(day (/ (float day) 60 60 24))
(time (org-element-property :duration element))
(time (org-duration-to-minutes time))
(time (* time 60)))
(puthash day (+ (gethash day days 0) time) days)
(org-forward-element)
(recur days))
days))))))
where the my-exercise-id
is
(defcustom my-exercise-id "0DB14413-C66D-41F6-A6C0-17F433F0B740"
"ID of the Org heading on which all exercises are clocked.")