]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/op_queue.rs
Merge #7777
[rust.git] / crates / rust-analyzer / src / op_queue.rs
1 //! Bookkeeping to make sure only one long-running operation is executed.
2
3 pub(crate) struct OpQueue<D> {
4     op_scheduled: Option<D>,
5     op_in_progress: bool,
6 }
7
8 impl<D> Default for OpQueue<D> {
9     fn default() -> Self {
10         Self { op_scheduled: None, op_in_progress: false }
11     }
12 }
13
14 impl<D> OpQueue<D> {
15     pub(crate) fn request_op(&mut self, data: D) {
16         self.op_scheduled = Some(data);
17     }
18     pub(crate) fn should_start_op(&mut self) -> Option<D> {
19         if self.op_in_progress {
20             return None;
21         }
22         self.op_in_progress = self.op_scheduled.is_some();
23         self.op_scheduled.take()
24     }
25     pub(crate) fn op_completed(&mut self) {
26         assert!(self.op_in_progress);
27         self.op_in_progress = false;
28     }
29 }