tconc-queue.scm 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Marcus Crestani
  3. ;; tconc queue for transport link cells
  4. ;; Teitelman 1974
  5. (define (make-tconc-queue)
  6. (let ((q (cons #f #f)))
  7. (cons q q)))
  8. (define (tconc-queue? thing)
  9. (and (pair? thing)
  10. (pair? (car thing))
  11. (pair? (cdr thing))))
  12. (define (tconc-queue-empty? tconc)
  13. (and (tconc-queue? tconc)
  14. (eq? (car tconc) (cdr tconc))))
  15. (define (tconc-queue-enqueue! tconc value)
  16. (let ((newpair (cons #f #f)))
  17. (set-car! (cdr tconc) value)
  18. (set-cdr! (cdr tconc) newpair)
  19. (set-cdr! tconc newpair)))
  20. (define (tconc-queue-dequeue! tconc)
  21. (if (tconc-queue-empty? tconc)
  22. (assertion-violation 'tconc-queue-dequeue "empty tconc queue" tconc)
  23. (let ((element (car (car tconc))))
  24. (set-car! tconc (cdr (car tconc)))
  25. element)))
  26. (define (tconc-queue-peek tconc)
  27. (if (tconc-queue-empty? tconc)
  28. (assertion-violation 'tconc-queue-peek "empty tconc queue" tconc)
  29. (car (car tconc))))
  30. (define (tconc-queue-clear! tconc)
  31. (let ((q (cons #f #f)))
  32. (set-car! tconc q)
  33. (set-cdr! tconc q)))
  34. (define (tconc-queue-size tconc)
  35. (if (and tconc (pair? tconc))
  36. (let loop-tconc ((x (car tconc))
  37. (count 0))
  38. (if (or (eq? x (cdr tconc))
  39. (not (pair? x)))
  40. count
  41. (loop-tconc (cdr x) (+ count 1))))
  42. (assertion-violation 'tconc-queue-size "not a valid tconc" tconc)))