+(define (update-document document changes)
+ "Update a document with the appropiate changes"
+ (cond ((null? changes)
+ document)
+ (else
+ (update-document ((car changes) document) (cdr changes)))))
+
+
+;;; Queries
+
+(define ($eq field value)
+ (lambda (document)
+ (let ((stored (assoc field document)))
+ (and stored
+ (equal? (cdr stored) value)))))
+
+(define ($exists field)
+ (lambda (document)
+ (and (assoc field document)
+ #t)))
+
+(define ($not expr)
+ (lambda (document)
+ (not (expr document))))
+
+(define-syntax $and
+ (syntax-rules ()
+ ((_ expr ...)
+ (lambda (document)
+ (and (expr document)
+ ...)))))
+
+
+;;; Updates