git.fiddlerwoaroof.com
Raw Blame History
(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)))))