;; Extension — result pagination (offset / limit) over ranked results.
;; Corpus (tf of "x" descending): 1 x4  2 x3  3 x2  4 x1  5 y(no x)
;; rankTfIdf ["x"] -> [1,2,3,4]

(define
  page-setup
  "idx = indexDoc 5 \"y\" (indexDoc 4 \"x\" (indexDoc 3 \"x x\" (indexDoc 2 \"x x x\" (indexDoc 1 \"x x x x other\" emptyIndex))))\n")

(define
  page-cases
  (list
    (list "first page" "pageTfIdf 0 2 [\"x\"] idx" (list 1 2))
    (list
      "second page"
      "pageTfIdf 2 2 [\"x\"] idx"
      (list 3 4))
    (list
      "sliding window"
      "pageTfIdf 1 2 [\"x\"] idx"
      (list 2 3))
    (list
      "limit exceeds remaining"
      "pageTfIdf 3 10 [\"x\"] idx"
      (list 4))
    (list "offset past end" "pageTfIdf 4 2 [\"x\"] idx" (list))
    (list "limit zero" "pageTfIdf 0 0 [\"x\"] idx" (list))
    (list
      "whole result"
      "pageTfIdf 0 10 [\"x\"] idx"
      (list 1 2 3 4))
    (list
      "paginate raw list"
      "paginate 1 2 [10, 20, 30, 40]"
      (list 20 30))
    (list "paginate raw past end" "paginate 9 2 [10, 20]" (list))
    (list
      "bm25 page window size"
      "[length (pageBm25 0 2 1.5 0.75 [\"x\"] idx)]"
      (list 2))
    (list "result count" "[resultCount [\"x\"] idx]" (list 4))
    (list "result count zero" "[resultCount [\"zzz\"] idx]" (list 0))))

(define
  page-results
  (search-batch page-setup (map (fn (c) (nth c 1)) page-cases)))

(map-indexed
  (fn
    (i c)
    (hk-test (nth c 0) (nth page-results i) (nth c 2)))
  page-cases)

{:fail hk-test-fail :pass hk-test-pass :fails hk-test-fails}
