about summary refs log tree commit diff
path: root/xapian/xapian.scm
diff options
context:
space:
mode:
Diffstat (limited to 'xapian/xapian.scm')
-rw-r--r--xapian/xapian.scm34
1 files 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 <arunisaac@systemreboot.net>
+;;; Copyright © 2020, 2022, 2024, 2025 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2021 Bob131 <bob@bob131.so>
 ;;;
 ;;; 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>
+  (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}."