main
Matthew Butterick 4 years ago
parent e15d690f50
commit 3f8f761d20

@ -43,19 +43,21 @@
[idx idx])) [idx idx]))
(for/fold ([vidx 0] (for/fold ([vidx 0]
#:result (and vidx (vector-ref vec vidx))) #:result (and vidx (vector-ref vec vidx)))
([query-piece (in-list (parse-query query-str))]) ([query-piece (in-list (parse-query query-str))]
#:break (not vidx))
(match query-piece (match query-piece
[(cons pred 'this) [(cons pred 'this)
;; resolve `this` by finding the querying quad, and searching backward ;; resolve `this` by finding the querying quad, and searching backward
(for/first ([vi (in-range (vector-memq starting-q vec) -1 -1)] (for/first ([vidx (in-range (vector-memq starting-q vec) -1 -1)]
#:when (pred (vector-ref vec vi))) #:when (pred (vector-ref vec vidx)))
vi)] vidx)]
[(cons pred count) [(cons pred count)
(for/fold ([vidx vidx] (for/fold ([vidx vidx]
;; sub 1 because return values add 1 ;; sub 1 because return values add 1
;; and final result should be location of matching quad ;; and final result should be location of matching quad
#:result (sub1 vidx)) #:result (and vidx (sub1 vidx)))
([seen (in-range count)]) ([seen (in-range count)]
#:break (not vidx))
(for/first ([vidx (in-range vidx (vector-length vec))] (for/first ([vidx (in-range vidx (vector-length vec))]
#:when (pred (vector-ref vec vidx))) #:when (pred (vector-ref vec vidx)))
;; add 1 so on next iteration, we can find next matcher ;; add 1 so on next iteration, we can find next matcher
@ -82,10 +84,11 @@
(define (page) (factory page-quad col)) (define (page) (factory page-quad col))
(define (sec) (factory section-quad page)) (define (sec) (factory section-quad page))
(define (count q) (quad-ref q 'count)) (define (count q) (and q (quad-ref q 'count)))
(define doc (factory doc-quad sec)) (define doc (factory doc-quad sec))
(check-eq? (query doc "page[this]" (query doc "line[2]")) (query doc "page[1]")) (check-eq? (query doc "page[this]" (query doc "line[2]")) (query doc "page[1]"))
(check-equal? (count (query doc "sec[2]")) 242) (check-equal? (count (query doc "sec[2]")) 242)
(check-false (query doc "sec[102]:line[1]"))
(check-equal? (count (query doc "sec[2]:pg[1]")) 162) (check-equal? (count (query doc "sec[2]:pg[1]")) 162)
(check-equal? (count (query doc "sec[2]:pg[1]:ln[3]")) 128)) (check-equal? (count (query doc "sec[2]:pg[1]:ln[3]")) 128))
Loading…
Cancel
Save