Simple database: Difference between revisions
Content added Content deleted
(→{{header|Common Lisp}}: use structs instead of alists. use struct specific print-function to produce output) |
|||
Line 38: | Line 38: | ||
<lang lisp>(defvar *db* nil) |
<lang lisp>(defvar *db* nil) |
||
(defstruct series description tags episodes) |
|||
(defun get-value (key alist) |
|||
(cdr (assoc key alist))) |
|||
( |
(defstruct (episode (:print-function print-episode-struct)) |
||
series title season episode date tags) |
|||
(defun print-episode ( |
(defun print-episode-struct (ep stream level) |
||
(let ((*print-pretty* nil)) |
|||
⚫ | |||
(format stream (if *print-escape* |
|||
(get-value 'series episode) |
|||
"#s(episode~@{~*~@[ :~1:*~a ~s~]~})" |
|||
⚫ | |||
(get-value 'episode episode) |
|||
:series (episode-series ep) |
|||
:season (episode-season ep) |
|||
:episode (episode-episode ep) |
|||
⚫ | |||
:date (if *print-escape* |
|||
(episode-date ep) |
|||
(reverse (episode-date ep))) |
|||
:tags (episode-tags ep)))) |
|||
(defun |
(defun get-value (key alist) |
||
( |
(cdr (assoc key alist))) |
||
(print-episode (acons 'series-name series (car episodes))) |
|||
(print-episodes (cdr episodes) series))) |
|||
(defun get-latest (database) |
(defun get-latest (database) |
||
(when database |
(when database |
||
(cons (car ( |
(cons (car (series-episodes (cdar database))) (get-latest (cdr database))))) |
||
(defun get-all (database) |
(defun get-all (database) |
||
(when database |
(when database |
||
(append ( |
(append (series-episodes (cdar database)) (get-all (cdr database))))) |
||
(defun compare-date (a b) |
(defun compare-date (a b) |
||
Line 74: | Line 76: | ||
(defun compare-by-date (a b) |
(defun compare-by-date (a b) |
||
(compare-date ( |
(compare-date (episode-date a) (episode-date b))) |
||
(defun prompt-read (prompt &optional default) |
(defun prompt-read (prompt &optional default) |
||
Line 111: | Line 113: | ||
(defun prompt-for-episode (&optional last) |
(defun prompt-for-episode (&optional last) |
||
(make-episode |
(make-episode |
||
:series (prompt-read "Series Title" ( |
:series (prompt-read "Series Title" (episode-series last)) |
||
:title (prompt-read "Title") |
:title (prompt-read "Title") |
||
:season (parse-number (prompt-read "Season" ( |
:season (parse-number (prompt-read "Season" (episode-season last))) |
||
:episode (parse-number (prompt-read "Episode" (1+ (or ( |
:episode (parse-number (prompt-read "Episode" (1+ (or (episode-episode last) 0)))) |
||
:date (parse-date (prompt-read "Date watched" (format-ymd))) |
:date (parse-date (prompt-read "Date watched" (format-ymd))) |
||
:tags (parse-tags (prompt-read "Tags")))) |
:tags (parse-tags (prompt-read "Tags")))) |
||
Line 140: | Line 142: | ||
(defun get-episode-list (series database) |
(defun get-episode-list (series database) |
||
( |
(series-episodes (get-series series database))) |
||
(defun print-series (series) |
(defun print-series (series) |
||
(format t "~30a ~@[ (~{~a~^ ~})~]~%" |
(format t "~30a ~a ~@[ (~{~a~^ ~})~]~%" |
||
( |
(car series) (series-description (cdr series)) (series-tags (cdr series))) |
||
⚫ | |||
(defun watch-series (title) |
(defun watch-series (title) |
||
(let ((series (get-series title *db*))) |
(let ((series (get-series title *db*))) |
||
(format t "~30a ~@[ (~{~a~^ ~})~]~% |
(format t "~30a ~@[ (~{~a~^ ~})~]~% ~a~%" title (series-tags series) |
||
(series-description series)) |
|||
(format t "~{~a~%~}" (reverse (series-episodes series))))) |
|||
(defun dump-db (database) |
(defun dump-db (database) |
||
Line 156: | Line 160: | ||
(defun watch-latest () |
(defun watch-latest () |
||
( |
(format t "~{~a~%~}" (sort (get-latest *db*) #'compare-by-date))) |
||
(defun watch-all () |
(defun watch-all () |
||
( |
(format t "~{~a~%~}" (sort (get-all *db*) #'compare-by-date))) |
||
(defun watch-new-series (&key name description tags) |
(defun watch-new-series (&key name description tags) |
||
(cdar (push |
(cdar (push (cons name (make-series :description description :tags tags)) *db*))) |
||
(defun get-or-add-series (name database) |
(defun get-or-add-series (name database) |
||
Line 175: | Line 179: | ||
(defun watch-add () |
(defun watch-add () |
||
(let* ((series (loop thereis (get-or-add-series (prompt-read "Series") *db*))) |
(let* ((series (loop thereis (get-or-add-series (prompt-read "Series") *db*))) |
||
( |
(episode (prompt-for-episode (car (series-episodes series))))) |
||
(push episode (series-episodes series)))) |
|||
⚫ | |||
⚫ | |||
(defun watch-series-names () |
(defun watch-series-names () |
||
(format T "~{~a~%~}" |
(format T "~{~a~%~}" |
||
(sort (mapcar #'car *db*) |
(sort (mapcar #'car *db*) |
||
(lambda (series1 series2) |
|||
(compare-by-date (car (series-episodes (get-value series1 *db*))) |
|||
(car (series-episodes (get-value series2 *db*)))))))) |
|||
(defun watch-load (dbfile) |
(defun watch-load (dbfile) |