(define (maybe-accumulate node get-next)
  (if *debug-trace?*
      (begin
	(fresh-line)
	(write-string ";trace: ")
	(write (node-name node))
	(newline)))
  (if (node-value node)
      (cons node get-next)
      (get-next)))

(define *debug-trace?* #f)


(define (loop-avoidance-node-filter)
  (let ((table (make-eq-hash-table)))
    (lambda (node)
      (if (hash-table/get table node #f)
	  #f
	  (begin
	    (hash-table/put! table node #t)
	    node)))))

;;;; Supporting data structures

(define (make-node name value . links)
  (cons* 'node name value links))

(define (node-name node)
  (cadr node))

(define (node-value node)
  (caddr node))

(define (node-links node)
  (cdddr node))

(define (make-link thunk #!optional priority)
  (list 'link (if (default-object? priority) 0 priority) thunk))

(define (dereference-link link node-filter)
  (let ((node ((caddr link))))
    (if node
	(node-filter node)
	#f)))

(define (link-priority link)
  (cadr link))

(define (search-values->list values)
  (if (pair? values)
      (cons (car values) (search-values->list ((cdr values))))
      '()))
