|
|
@ -40,8 +40,9 @@
|
|
|
|
(define qi (match quad-or-index
|
|
|
|
(define qi (match quad-or-index
|
|
|
|
[(? quad? q) (make-query-index q)]
|
|
|
|
[(? quad? q) (make-query-index q)]
|
|
|
|
[idx idx]))
|
|
|
|
[idx idx]))
|
|
|
|
(for/fold ([qs (query-index-forward qi)]
|
|
|
|
(define vec (list->vector (query-index-forward qi)))
|
|
|
|
#:result (and qs (car qs)))
|
|
|
|
(for/fold ([vidx 0]
|
|
|
|
|
|
|
|
#:result (and vidx (vector-ref vec vidx)))
|
|
|
|
([query-piece (in-list (parse-query query-str))])
|
|
|
|
([query-piece (in-list (parse-query query-str))])
|
|
|
|
(match query-piece
|
|
|
|
(match query-piece
|
|
|
|
[(cons pred 'this)
|
|
|
|
[(cons pred 'this)
|
|
|
@ -50,13 +51,17 @@
|
|
|
|
;; once we have this-thing, locate it in the forward index and keep going
|
|
|
|
;; once we have this-thing, locate it in the forward index and keep going
|
|
|
|
(memq this-thing (query-index-forward qi))]
|
|
|
|
(memq this-thing (query-index-forward qi))]
|
|
|
|
[(cons pred count)
|
|
|
|
[(cons pred count)
|
|
|
|
(let loop ([qs qs][seen 0])
|
|
|
|
(let loop ([vidx vidx][seen 0])
|
|
|
|
(define maybe-tail (memf pred qs))
|
|
|
|
(define idx (for*/first ([vi (in-range vidx (vector-length vec))]
|
|
|
|
(and maybe-tail
|
|
|
|
[val (in-value (vector-ref vec vi))]
|
|
|
|
|
|
|
|
#:when (pred val))
|
|
|
|
|
|
|
|
vi))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(and idx
|
|
|
|
(let ([seen (add1 seen)])
|
|
|
|
(let ([seen (add1 seen)])
|
|
|
|
(cond
|
|
|
|
(cond
|
|
|
|
[(= seen count) maybe-tail]
|
|
|
|
[(= seen count) idx]
|
|
|
|
[else (loop (cdr maybe-tail) seen)]))))])))
|
|
|
|
[else (loop (add1 idx) seen)]))))])))
|
|
|
|
|
|
|
|
|
|
|
|
(module+ test
|
|
|
|
(module+ test
|
|
|
|
(require rackunit)
|
|
|
|
(require rackunit)
|
|
|
|