Simple database: Difference between revisions

Content added Content deleted
(→‎{{header|Tcl}}: Add session log)
(→‎{{header|Common Lisp}}: improve handling of series title)
Line 38: Line 38:
<lang lisp>(defvar db nil)
<lang lisp>(defvar db nil)


(defun make-episode (series title episode date-watched)
(defun make-episode (&key series title episode date)
`((series . ,series) (episode . ,episode) (title . ,title) (date . ,date-watched)))
`((series . ,series) (episode . ,episode) (title . ,title) (date . ,date)))


(defun print-episode (episode)
(defun print-episode (episode)
Line 46: Line 46:
(cdr (assoc 'title episode)) (cdr (assoc 'date episode))))
(cdr (assoc 'title episode)) (cdr (assoc 'date episode))))


(defun print-series (series)
(defun print-episodes (episodes series)
(or (null episodes)
(format t "~30a ~10a~%" (cdr (assoc 'series series)) (cdr (assoc 'status series)))
(mapcar #'print-episode (cdr (assoc 'episodes series))))
(print-episode (acons 'series-name series (car episodes)))
(print-episodes (cdr episodes) series)))

(defun dump-db (database)
(dolist (series database)
(print-series (cdr series))))



(defun get-latest (database)
(defun get-latest (database)
Line 69: Line 65:
(compare-date (reverse (cdr (assoc 'date a))) (reverse (cdr (assoc 'date b)))))
(compare-date (reverse (cdr (assoc 'date a))) (reverse (cdr (assoc 'date b)))))


(defun prompt-read (prompt)
(defun prompt-read (prompt &optional (default ""))
(format *query-io* "~a: " prompt)
(format *query-io* "~a (~a): " prompt default)
(force-output *query-io*)
(force-output *query-io*)
(read-line *query-io*))
(let ((answer (read-line *query-io*)))
(if (string= answer "") default answer)))


(defun split (seperator string)
(defun split (seperator string)
Line 83: Line 80:
(mapcar #'parse-integer (split "." date)))
(mapcar #'parse-integer (split "." date)))


(defun prompt-for-episode ()
(defun prompt-for-episode (&optional last)
(make-episode
(make-episode
(prompt-read "Series")
:series (prompt-read "Series Title" (cdr (assoc 'series last)))
(prompt-read "Title")
:title (prompt-read "Title")
(prompt-read "Episode")
:episode (prompt-read "Episode")
(parse-date (prompt-read "Date watched"))))
:date (parse-date (prompt-read "Date watched"))))


(defun save-db (filename database)
(defun save-db (filename database)
Line 113: Line 110:
(defun get-episode-list (series database)
(defun get-episode-list (series database)
(cdr (assoc 'episodes (get-series series database))))
(cdr (assoc 'episodes (get-series series database))))

(defun print-series (series)
(format t "~30a ~10a~%" (cdr (assoc 'series series)) (cdr (assoc 'status series)))
(mapcar #'print-episode (cdr (assoc 'episodes series))))

(defun watch-series (title)
(let ((series (get-series title db)))
(format t "~30a ~10a~%" (cdr (assoc 'series series)) (cdr (assoc 'status series)))
(mapcar #'print-episode (reverse (cdr (assoc 'episodes series))))))

(defun dump-db (database)
(dolist (series database)
(print-series (cdr series))))


(defun watch-latest ()
(defun watch-latest ()
(mapcar #'print-episode (sort (get-latest db) #'compare-by-date)))
(mapcar #'print-episode (sort (get-latest db) #'compare-by-date)))

(defun watch-series (series)
(mapcar #'print-episode (reverse (get-episode-list series db))))


(defun watch-new-series (name status)
(defun watch-new-series (name status)
Line 129: Line 136:


(defun watch-add ()
(defun watch-add ()
(let* ((series (loop thereis (get-or-add-series (prompt-read "Series") db)))
(let* ((episode (prompt-for-episode))
(series-name (cdr (assoc 'series episode)))
(episodes (cdr (assoc 'episodes series)))
(series (get-or-add-series series-name db)))
(episode (prompt-for-episode (car episodes))))
(if (endp series) (watch-add)
(rplacd (assoc 'episodes series)
(rplacd (assoc 'episodes series)
(cons episode (get-episode-list series-name db))))))
(cons episode episodes))))


(defun watch-series-names ()
(defun watch-series-names ()