1use std::collections::VecDeque;
2
3use itertools::Itertools;
4
5use crate::{Point, PointDefinition, Value, Word, WriteError};
6
7#[derive(Debug, Clone, Default)]
8pub struct WriteQueue(VecDeque<PendingWrite>);
9
10impl WriteQueue {
11 pub fn new() -> Self {
12 Self::default()
13 }
14
15 pub fn enqueue<V: Value>(&mut self, point: Point<V>, value: V) -> Result<(), WriteError> {
16 if !point.is_writable() {
18 return Err(WriteError::NotWritable);
19 }
20 self.0.push_back(PendingWrite {
21 point_def: point.def,
22 raw_value: value.encode(),
23 });
24 Ok(())
25 }
26
27 pub fn dequeue(&mut self) -> Option<PendingWrite> {
28 self.0.pop_front()
29 }
30
31 pub fn dequeue_all(&mut self) -> Vec<PendingWrite> {
32 self.0.drain(..).collect_vec()
33 }
34}
35
36#[derive(Debug, Clone)]
37pub struct PendingWrite {
38 point_def: PointDefinition,
39 raw_value: Box<[Word]>,
40}
41
42impl PendingWrite {
43 pub fn point_def(&self) -> PointDefinition {
44 self.point_def
45 }
46 pub fn raw_value(&self) -> &Box<[Word]> {
47 &self.raw_value
48 }
49}