From a929503433665ba0629fb46f39081c192eb5240e Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Sat, 22 Feb 2025 01:56:47 +0000 Subject: xapian: Generalize mset-fold to iterator->fold. * xapian/xapian.scm: Import (srfi srfi-9). (): New record type. (enquire-mset): Return object. (iterator->fold): New function. (mset-fold): Redefine using iterator->fold. --- xapian/xapian.scm | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/xapian/xapian.scm b/xapian/xapian.scm index 1d7c961..0389e26 100644 --- a/xapian/xapian.scm +++ b/xapian/xapian.scm @@ -1,5 +1,5 @@ ;;; guile-xapian --- Guile bindings for Xapian -;;; Copyright © 2020, 2022, 2024 Arun Isaac +;;; Copyright © 2020, 2022, 2024, 2025 Arun Isaac ;;; Copyright © 2021 Bob131 ;;; ;;; This file is part of guile-xapian. @@ -23,6 +23,7 @@ #:use-module (rnrs bytevectors) #:use-module (ice-9 match) #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) #:use-module (htmlprag) #:use-module (xapian wrap) @@ -69,6 +70,12 @@ mset-snippet mset-sxml-snippet)) +(define-record-type + (iterable start end) + iterable? + (start iterable-start) + (end iterable-end)) + (define xapian-open new-Database) (define xapian-close delete-Database) @@ -238,21 +245,28 @@ result set. MAXIMUM-ITEMS specifies the maximum number of items to return. To return all matches, pass the result of calling database-document-count on the database object." - (Enquire-get-mset enquire offset maximum-items)) + (let ((mset (Enquire-get-mset enquire offset maximum-items))) + (iterable (MSet-begin mset) + (MSet-end mset)))) (define mset-item-docid MSetIterator-get-docid) (define mset-item-document MSetIterator-get-document) (define mset-item-rank MSetIterator-get-rank) (define mset-item-weight MSetIterator-get-weight) -(define (mset-fold proc init mset) - (let loop ((head (MSet-begin mset)) - (result init)) - (cond - ((MSetIterator-equals head (MSet-end mset)) result) - (else (let ((result (proc head result))) - (MSetIterator-next head) - (loop head result)))))) +(define (iterator->fold iterator-next iterator-equals) + (lambda (proc init iterable) + (let loop ((head (iterable-start iterable)) + (result init)) + (cond + ((iterator-equals head (iterable-end iterable)) result) + (else + (let ((result (proc head result))) + (iterator-next head) + (loop head result))))))) + +(define mset-fold + (iterator->fold MSetIterator-next MSetIterator-equals)) (define (query term) "Return a @code{Query} object for @var{term}." -- cgit 1.4.1