Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 44s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
1.5 KiB
Plaintext
51 lines
1.5 KiB
Plaintext
; feed/page — pagination. Offset/limit for indexed access, and cursor-based
|
|
; (by :at) for recency feeds, which is stable under inserts: a cursor is the
|
|
; :at of the last item seen, and the next page is the newest items older than it.
|
|
;
|
|
; Requires: lib/feed/stream.sx (feed/recent, feed/take, feed/filter).
|
|
|
|
; --- offset / limit ---------------------------------------------------------
|
|
|
|
(define
|
|
feed/page
|
|
(fn
|
|
(stream offset limit)
|
|
(feed/stream (take (drop (feed/items stream) offset) limit))))
|
|
|
|
(define
|
|
feed/page-count
|
|
(fn (stream limit) (ceil (/ (feed/count stream) limit))))
|
|
|
|
; --- cursor (recency feeds) -------------------------------------------------
|
|
|
|
; activities strictly older than cursor (scroll down / load older)
|
|
(define
|
|
feed/before
|
|
(fn
|
|
(stream cursor)
|
|
(feed/filter stream (fn (a) (< (get a :at) cursor)))))
|
|
|
|
; activities strictly newer than cursor (load newer / "N new posts")
|
|
(define
|
|
feed/after
|
|
(fn
|
|
(stream cursor)
|
|
(feed/filter stream (fn (a) (> (get a :at) cursor)))))
|
|
|
|
; one page: the `limit` newest activities older than cursor, newest first
|
|
(define
|
|
feed/page-before
|
|
(fn
|
|
(stream cursor limit)
|
|
(feed/take (feed/recent (feed/before stream cursor)) limit)))
|
|
|
|
; cursor to fetch the next (older) page: :at of the last item of a page,
|
|
; or nil when the page is empty (end of feed)
|
|
(define
|
|
feed/next-cursor
|
|
(fn
|
|
(page)
|
|
(let
|
|
((items (feed/items page)))
|
|
(if (= (len items) 0) nil (get (last items) :at)))))
|