repeatedly.ss
#lang scheme/base

(require scheme/promise)

(define (repeatedly maximum err proc)
  (let loop ((tries 0))
    (let/ec okay
      (let/ec retry
        (call-with-values
         (λ () (proc retry))
         okay))
      (if (< tries maximum)
          (loop (+ tries 1))
          (error (if (promise? err) (force err) err))))))

(define (test)
  (list
   (with-handlers
       ((exn:fail? (λ (e) "yay we failed\n")))
     (repeatedly
      10
      "fail"
      (λ (retry)
        (display "beep\n")
        (retry))))
   
   (repeatedly
    10
    "no problem"
    (λ (retry)
      "...BOOP\n"))))
  
  
(provide repeatedly)