(defpackage :gap-dates (:use :cl)) (in-package :gap-dates) (defun gap-sequence (seq diff-fun diff) (reverse (reduce (lambda (accum next) (let ((prev (car accum))) (if (>= (funcall diff-fun next prev) diff) (cons next accum) accum))) (cdr seq) :initial-value (list (elt seq 0))))) (defun read-dates (dates) (mapcar (lambda (date) (local-time:parse-timestring date)) dates)) (defun prune-dates (dates exclude-last-n) (let ((last-date-idx (- (length dates) exclude-last-n))) (append (gap-sequence (subseq dates 0 last-date-idx) 'local-time:timestamp-difference #.(* 60 60 24 7)) (subseq dates last-date-idx)))) (defun get-dates () (mapcar (alexandria:compose 'car 'last 'pathname-directory) (uiop:directory* "~/.feed-archive/????-??-??"))) (defun main (inp) (let ((local-time:*default-timezone* local-time:+utc-zone+)) (let* ((dates (read-dates inp)) (keep (prune-dates dates 31))) (mapcar (serapeum:op (local-time:format-timestring nil _ :format local-time:+iso-8601-date-format+)) (set-difference dates keep :test 'equal)))))