; double space

(define (double-space oldstr)
  (define (space? str idx)
    (char=? (string-ref str idx) #\space))
  (let ((oldlen (string-length oldstr)))
    (do ((oldidx 0 (+ oldidx 1))
         (count 0 (+ count (if (space? oldstr oldidx) 1 0))))
        ((= oldidx oldlen)
          (let* ((newlen (+ oldlen count))
                 (newstr (make-string newlen #\space)))
            (do ((oldidx 0 (+ oldidx 1))
                 (newidx 0 (+ newidx (if (space? newstr newidx) 2 1))))
                ((= oldidx oldlen) newstr)
              (string-set! newstr newidx (string-ref oldstr oldidx))))))))

(display (double-space "hello")) (newline)
(display (double-space "hello hello")) (newline)
(display (double-space "hello  hello")) (newline)
(display (double-space "hello   hello")) (newline)
(display (double-space "hello hello hello")) (newline)
(display (double-space " hello ")) (newline)
(display (double-space "")) (newline)
(display (double-space " ")) (newline)
(display (double-space "  ")) (newline)
(display (double-space "   ")) (newline) (newline)

(define (double-space str)
  (let loop ((xs (string->list str)) (zs (list)))
    (if (null? xs) (list->string (reverse zs))
      (if (char=? (car xs) #\space)
          (loop (cdr xs) (cons #\space (cons #\space zs)))
          (loop (cdr xs) (cons (car xs) zs))))))

(display (double-space "hello")) (newline)
(display (double-space "hello hello")) (newline)
(display (double-space "hello  hello")) (newline)
(display (double-space "hello   hello")) (newline)
(display (double-space "hello hello hello")) (newline)
(display (double-space " hello ")) (newline)
(display (double-space "")) (newline)
(display (double-space " ")) (newline)
(display (double-space "  ")) (newline)
(display (double-space "   ")) (newline)