; text file databases: part 2
(define (fold-port reader folder base . port)
(let ((p (if (null? port) (current-input-port) (car port))))
(let loop ((item (reader p)) (result base))
(if (eof-object? item)
result
(loop (reader p) (folder result item))))))
(define (map-port reader mapper . port)
(let ((p (if (null? port) (current-input-port) (car port))))
(let loop ((item (reader p)) (result '()))
(if (eof-object? item)
(reverse result)
(loop (reader p) (cons (mapper item) result))))))
(define (for-each-port reader proc . port)
(let ((p (if (null? port) (current-input-port) (car port))))
(let loop ((item (reader p)))
(if (not (eof-object? item))
(begin (proc item) (loop (reader p)))))))
(define (filter-port reader pred?)
(lambda args
(let loop ((x (apply reader args)))
(cond ((eof-object? x) x)
((pred? x) x)
(else (loop (apply reader args)))))))