diff options
author | Matthew Sotoudeh <matthewsot@outlook.com> | 2021-01-05 08:37:33 -0800 |
---|---|---|
committer | Matthew Sotoudeh <matthewsot@outlook.com> | 2021-01-05 08:37:33 -0800 |
commit | 521940ea33fc91ae9ac1a096fbddf41fccb0dd0b (patch) | |
tree | d500d109db97d6c217c5e70a9f6d2f111ffff17b | |
parent | 8fee8df241753daef3b37bc2525ccf0f575ea2c2 (diff) |
Allow for re-filtering the current feed instead of entirely re-fetching
-rw-r--r-- | audrey3/feed.rkt | 26 | ||||
-rw-r--r-- | audrey3/feeddef.rkt | 5 | ||||
-rw-r--r-- | audrey3/filter.rkt | 3 | ||||
-rw-r--r-- | audrey3/ui.rkt | 5 | ||||
-rw-r--r-- | example.rkt | 4 |
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))))] |