(import (chibi time) (scheme cxr) (srfi 33) (srfi 39))

(define (timeval->milliseconds tv)
  (quotient (+ (* 1000000 (timeval-seconds tv)) (timeval-microseconds tv))
            1000))

(define (time* thunk)
  (call-with-output-string
    (lambda (out)
      (let* ((start (car (get-time-of-day)))
             (result (parameterize ((current-output-port out)) (thunk)))
             (end (car (get-time-of-day)))
             (msecs (- (timeval->milliseconds end)
                       (timeval->milliseconds start))))
        (display "user: ")
        (display msecs)
        (display " system: 0")
        (display " real: ")
        (display msecs)
        (display " gc: 0")
        (newline)
        (display "result: ")
        (write result)
        (newline)
        result))))

(define-syntax time
  (syntax-rules ()
    ((_ expr) (time* (lambda () expr)))))