summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sotoudeh <matthewsot@outlook.com>2021-01-05 08:37:33 -0800
committerMatthew Sotoudeh <matthewsot@outlook.com>2021-01-05 08:37:33 -0800
commit521940ea33fc91ae9ac1a096fbddf41fccb0dd0b (patch)
treed500d109db97d6c217c5e70a9f6d2f111ffff17b
parent8fee8df241753daef3b37bc2525ccf0f575ea2c2 (diff)
Allow for re-filtering the current feed instead of entirely re-fetching
-rw-r--r--audrey3/feed.rkt26
-rw-r--r--audrey3/feeddef.rkt5
-rw-r--r--audrey3/filter.rkt3
-rw-r--r--audrey3/ui.rkt5
-rw-r--r--example.rkt4
5 files changed, 30 insertions, 13 deletions
diff --git a/audrey3/feed.rkt b/audrey3/feed.rkt
index 20507f5..d98f92c 100644
--- a/audrey3/feed.rkt
+++ b/audrey3/feed.rkt
@@ -11,23 +11,37 @@
read-feed
feed->lview
feed-items
- feed-feeddef)
+ feed-feeddef
+ refilter-feed)
; Each 'source' here is actually a (source . filter) pair.
-(struct feed (feeddef sources items db))
+; Each item-with-filter is an (item . filter) pair.
+(struct feed (feeddef sources items-with-filters db))
; Builds a new feed, but does not yet get any of the items
(define (build-feed feeddef db)
(feed feeddef (feeddef->sources feeddef db) '() db))
-; Returns a copy of current-feed with @items populated.
(define (read-source source [force? #f])
(source force?))
+; Returns a copy of current-feed with @items populated.
(define (read-feed current-feed [force? #f])
- (let* ([items (append-map (curryr read-source force?)
- (feed-sources current-feed))])
- (struct-copy feed current-feed [items items])))
+ (let* ([items-with-filters (append-map (curryr read-source force?)
+ (feed-sources current-feed))])
+ (struct-copy feed current-feed [items-with-filters items-with-filters])))
+
+(define (refilter-feed current-feed db)
+ (struct-copy
+ feed
+ current-feed
+ [items-with-filters
+ (filter (lambda (item-filter)
+ (check-filter (cdr item-filter) (car item-filter) db))
+ (feed-items-with-filters current-feed))]))
+
+(define (feed-items feed)
+ (map car (feed-items-with-filters feed)))
(define (feed->lview feed start-line n-lines selected-index)
(let* ([items (map feed-item-title (feed-items feed))]
diff --git a/audrey3/feeddef.rkt b/audrey3/feeddef.rkt
index 97046c4..6c49cce 100644
--- a/audrey3/feeddef.rkt
+++ b/audrey3/feeddef.rkt
@@ -20,8 +20,9 @@
(feeddef->source-dnf expr)
(lambda (source fltr)
(lambda ([force-refresh #f])
- (filter (lambda (item) (check-filter fltr item db))
- (source fltr force-refresh))))))
+ (map (curryr cons fltr)
+ (filter (lambda (item) (check-filter fltr item db))
+ (source fltr force-refresh)))))))
; NOTE: This just expands at most one top-level macro, it doesn't recurse.
(define (expand-macros expr)
diff --git a/audrey3/filter.rkt b/audrey3/filter.rkt
index 193d482..af652a3 100644
--- a/audrey3/filter.rkt
+++ b/audrey3/filter.rkt
@@ -51,9 +51,6 @@
[`(attr ,key)
(feed-item->attr-value item (eval-filter key item))]
[`(now) (current-seconds)]
- ; Using (today) allows you to cache things for longer than (now).
- ; Alternatively, maybe web-cache should index on something other than
- ; the raw URL.
[`(today) (date->seconds
(struct-copy date (current-date)
[second 0] [hour 0] [minute 0]))]
diff --git a/audrey3/ui.rkt b/audrey3/ui.rkt
index 3704955..784d57e 100644
--- a/audrey3/ui.rkt
+++ b/audrey3/ui.rkt
@@ -79,6 +79,11 @@
[`(pager-prev) (update-state state 'pager pager-prev-line)]
[`(fetch-current-feed ,force?)
(set-state-feed state (read-feed (state-get state 'feed) force?) #f #t)]
+ [`(refilter-current-feed)
+ (set-state-feed
+ state
+ (refilter-feed (state-get state 'feed) (state-get state 'db))
+ #f #t)]
[`(quit) #f]
[`(history-back)
(let ([new-state (state-get state 'checkpoint)])
diff --git a/example.rkt b/example.rkt
index 6a973bc..b2833db 100644
--- a/example.rkt
+++ b/example.rkt
@@ -87,12 +87,12 @@
[#\q '(history-back)]
[#\f `(fetch-current-feed #t)]
[#\I `(begin (give-label (current-item) "triaged" "url")
- (fetch-current-feed #f))]
+ (refilter-current-feed))]
[#\R `(begin (save-item (current-item))
(give-label (current-item) "read-later" "url")
(give-label (current-item) "triaged" "url")
(give-label (current-item) (,read-today-label) "url")
- (fetch-current-feed #f))]
+ (refilter-current-feed))]
[#\* `(open-feed (,read-today-feeddef))]
[#\e `(open-feed
(car (edit "templates/edit-feeddef.rkt" (current-feeddef))))]
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback