code for keeping command/result histories
This commit is contained in:
		
							parent
							
								
									725e58f2a1
								
							
						
					
					
						commit
						783bad745a
					
				| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
(define-record-type history :history
 | 
			
		||||
  (really-make-history first last)
 | 
			
		||||
  history?
 | 
			
		||||
  (first history-first set-history-first!)
 | 
			
		||||
  (last history-last set-history-last!))
 | 
			
		||||
 | 
			
		||||
(define-record-type entry :entry
 | 
			
		||||
  (make-entry data prev next)
 | 
			
		||||
  entry?
 | 
			
		||||
  (data entry-data)
 | 
			
		||||
  (prev entry-prev set-entry-prev!)
 | 
			
		||||
  (next entry-next set-entry-next!))
 | 
			
		||||
 | 
			
		||||
(define-record-discloser :entry
 | 
			
		||||
  (lambda (r)
 | 
			
		||||
    `(entry ,(entry-data r))))
 | 
			
		||||
 | 
			
		||||
(define (make-empty-history)
 | 
			
		||||
  (really-make-history #f #f))
 | 
			
		||||
 | 
			
		||||
(define (append-history-item! history data)
 | 
			
		||||
  (let ((new-entry (make-entry data (history-last history) #f)))
 | 
			
		||||
    (cond
 | 
			
		||||
     ((history-last history)
 | 
			
		||||
      => (lambda (old-last)
 | 
			
		||||
	   (set-entry-next! old-last new-entry)
 | 
			
		||||
	   (set-history-last! history new-entry)))
 | 
			
		||||
     (else
 | 
			
		||||
      (set-history-first! history new-entry)
 | 
			
		||||
      (set-history-last! history new-entry)))))
 | 
			
		||||
 | 
			
		||||
(define (insert-history-item! history entry data)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((and (entry-prev entry) (entry-next entry))
 | 
			
		||||
    => (lambda (next)
 | 
			
		||||
	 (let ((new-entry (make-entry data entry next)))
 | 
			
		||||
	   (set-entry-prev! next new-entry)
 | 
			
		||||
	   (set-entry-next! entry new-entry))))
 | 
			
		||||
   ((entry-prev entry)
 | 
			
		||||
    (append-history-item! history data))
 | 
			
		||||
   ((entry-next entry)
 | 
			
		||||
    => (lambda (new-second)
 | 
			
		||||
	 (let ((new-first (make-entry data #f new-second)))
 | 
			
		||||
	   (set-history-first! history new-first)
 | 
			
		||||
	   (set-entry-prev! new-second new-first))))
 | 
			
		||||
   (else
 | 
			
		||||
    (append-history-item! history data))))
 | 
			
		||||
 | 
			
		||||
(define history-next-entry entry-next)
 | 
			
		||||
 | 
			
		||||
(define history-prev-entry entry-prev)
 | 
			
		||||
 | 
			
		||||
(define history-first-entry history-first)
 | 
			
		||||
 | 
			
		||||
(define history-last-entry history-last)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue