///|
pub fn request_with_timeout(
  mgr : @event.EventManager,
  res : Resource,
  amount : Int,
  priority : Int,
  timeout : Double,
  callback : (Bool) -> Unit,
) -> @clock.EventId {
  let mut completed = false
  let mut req_id_box = 0
  let mut timeout_ev_box = @clock.EventId::{ seq: 0L }

  let timeout_ev = mgr.schedule_action(timeout, priority, fn() {
    if !completed {
      completed = true
      let _ = res.cancel_request(req_id_box)
      callback(false)
    }
  })
  timeout_ev_box = timeout_ev

  let req_id = res.request(amount, priority, fn(success : Bool) {
    if !completed {
      completed = true
      let _ = mgr.clock().cancel(timeout_ev_box)
      callback(success)
    }
  })
  req_id_box = req_id
  timeout_ev
}