git.fiddlerwoaroof.com
gap-dates/gap-dates.lisp
cd516d74
 (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)))))