#lang racket/base
(require racket/contract
         future-visualizer/private/visualizer-data)
(provide (struct-out future-event)
         (struct-out gc-info)
         (struct-out indexed-future-event)
         trace-futures
         (contract-out
          [start-future-tracing! (-> void?)]
          [stop-future-tracing! (-> void?)]
          [timeline-events (-> (listof indexed-future-event?))]
          [trace-futures-thunk ((-> any/c) . -> . (listof indexed-future-event?))]))

(define-syntax-rule (trace-futures e ...)
  (begin (start-future-tracing!)
         (begin (begin e ...)
                (stop-future-tracing!)
                (timeline-events))))

;;trace-futures-thunk : (-> any) -> (listof indexed-future-event)
(define (trace-futures-thunk thunk)
  (start-future-tracing!)
  (begin
    (thunk)
    (stop-future-tracing!)
    (timeline-events)))
