From ced7b9eda99480dabe5dc8c7458c93398834face Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 15 Feb 2020 08:58:35 -0800 Subject: [PATCH] ok --- quad/quadwriter/query.rkt | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/quad/quadwriter/query.rkt b/quad/quadwriter/query.rkt index d5e8c127..c0f6df28 100644 --- a/quad/quadwriter/query.rkt +++ b/quad/quadwriter/query.rkt @@ -39,12 +39,12 @@ ;; if lidx is bigger, search backward [(> start-arg end-arg) (values start-arg (sub1 end-arg) -1)] [else (values start-arg (add1 end-arg) 1)])) - (for/fold ([start-1 (sub1 start)]) ; sub1 for reason below + (for/fold ([start-adjusted (- start step)]) ; remove step for reason below ([seen (in-range count)] - #:break (not start-1)) - ;; add 1 so on next iteration, we can find next matcher - ;; and won't re-find this one immediately - (for/first ([idx (in-range (add1 start-1) end step)] + #:break (not start-adjusted)) + ;; add step so we find next matcher + ;; and won't re-find the last one immediately + (for/first ([idx (in-range (+ start-adjusted step) end step)] #:when (pred (vector-ref vec idx))) idx))) @@ -61,11 +61,11 @@ (define res-idx (match count [(== 'this eq?) ; start at querying quad, then search backward - (find-inclusive vec pred (sub1 (vector-memq starting-q vec)) 0)] + (find-inclusive vec pred (vector-memq starting-q vec) 0)] [(== 'last eq?) ; search backward from end (find-inclusive vec pred maxidx 0)] - [(== 'prev eq?) (find-inclusive vec pred (sub1 (vector-memq starting-q vec)) 0 2)] - [(== 'next eq?) (find-inclusive vec pred (add1 (vector-memq starting-q vec)) maxidx)] + [(== 'prev eq?) (find-inclusive vec pred (vector-memq starting-q vec) 0 2)] + [(== 'next eq?) (find-inclusive vec pred ((if (pred starting-q) add1 values) (vector-memq starting-q vec)) maxidx)] [count (find-inclusive vec pred vidx maxidx count)])) (define next-maxidx (cond @@ -104,8 +104,13 @@ (check-equal? (count (query doc "sec[2]:pg[1]:ln[3]")) 128) (check-eq? (query doc "page[this]" (query doc "line[2]")) (query doc "page[1]")) (check-equal? (count (query doc "page[this]:line[last]" (query doc "line[2]"))) 41) - + + (check-equal? (count (query doc "sec[next]" (query doc "sec[1]"))) (count (query doc "sec[2]")) ) + (check-equal? (count (query doc "sec[prev]" (query doc "sec[2]"))) (count (query doc "sec[1]"))) - (check-equal? (count (query doc "sec[2]")) (count (query doc "sec[next]" (query doc "sec[1]")))) - (check-equal? (count (query doc "sec[1]")) (count (query doc "sec[prev]" (query doc "sec[2]")))) + (check-equal? (count (query doc "page[prev]" (query doc "page[2]:line[1]"))) + (count (query doc "page[1]"))) + (check-equal? (count (query doc "page[next]" (query doc "page[2]:line[1]"))) + (count (query doc "page[3]"))) + ) \ No newline at end of file