And the spinner implementation:

(define p
  (let ((index 0)
        (spinner-chars "|\\-/"))
    (define (spin)
      (set! index (+ index 1))
      (if (>= index (string-length spinner-chars))
        (set! index 0))
      (display (array-ref spinner-chars index))
      (display "\b"))
    (make-soft-port
           (vector
            (lambda (c) (if (char=? c #\newline) (spin) (write c))) ; putc
            (lambda (s) (if (string-contains s "\n") (spin))) ; puts
            (lambda () #t) ; flush
            (lambda () #f) ; getc
            (lambda () #t)) ; close
           "w")))

(define (f)
  (display "\n" p)
  (f))

(f)

Reply via email to