1use actix::Message;
2use serde::{Deserialize, Serialize};
3use std::sync::Arc;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6pub struct SeqGroup {
7 range_a: SeqRange,
8 range_b: SeqRange,
9 use_a: bool,
10 step: u64,
11 next_adding: bool,
13}
14
15impl SeqGroup {
16 pub fn new(step: u64) -> Self {
17 Self {
18 range_a: SeqRange::new(0, 0),
19 range_b: SeqRange::new(0, 0),
20 step,
21 use_a: false,
22 next_adding: false,
23 }
24 }
25 pub fn next_id(&mut self) -> Option<u64> {
26 let v = self.do_next_id();
27 if v.is_none() {
28 self.switch_state();
29 self.do_next_id()
30 } else {
31 v
32 }
33 }
34
35 pub fn apply_range(&mut self, start: u64, len: u64) {
36 if self.use_a && !self.range_a.has_next() || !self.use_a && self.range_b.has_next() {
37 self.range_a.renew(start, len);
38 } else {
39 self.range_b.renew(start, len);
40 }
41 }
42
43 pub fn mark_apply(&mut self) {
44 self.next_adding = true;
45 }
46
47 pub fn clear_apply_mark(&mut self) {
48 self.next_adding = false;
49 }
50
51 pub fn need_apply(&self) -> bool {
52 if self.next_adding {
53 return false;
54 }
55 if !self.range_a.has_next() || !self.range_b.has_next() {
56 true
57 } else {
58 false
59 }
60 }
61
62 fn do_next_id(&mut self) -> Option<u64> {
83 if self.use_a {
84 self.range_a.next_id()
85 } else {
86 self.range_b.next_id()
87 }
88 }
89
90 fn switch_state(&mut self) {
91 self.use_a = !self.use_a;
92 }
93}
94
95#[derive(Clone, Debug, Serialize, Deserialize, Default)]
96pub struct SeqRange {
97 pub(crate) start: u64,
98 pub(crate) len: u64,
99 current_index: u64,
100}
101
102impl SeqRange {
103 pub fn new(start: u64, len: u64) -> Self {
104 Self {
105 start,
106 len,
107 current_index: 0,
108 }
109 }
110
111 pub fn renew(&mut self, start: u64, len: u64) {
112 self.start = start;
113 self.len = len;
114 self.current_index = 0;
115 }
116
117 pub fn next_id(&mut self) -> Option<u64> {
118 if self.current_index >= self.len {
119 return None;
120 }
121 let v = self.start + self.current_index;
122 self.current_index += 1;
123 Some(v)
124 }
125
126 pub fn has_next(&self) -> bool {
127 self.current_index < self.len
128 }
129}
130
131#[derive(Message, Clone, Debug, Serialize, Deserialize)]
132#[rtype(result = "anyhow::Result<SequenceRaftResult>")]
133pub enum SequenceRaftReq {
134 NextId(Arc<String>),
135 NextRange(Arc<String>, u64),
136 SetId(Arc<String>, u64),
137 RemoveId(Arc<String>),
138}
139
140#[derive(Clone, Debug, Serialize, Deserialize)]
141pub enum SequenceRaftResult {
142 NextId(u64),
143 NextRange { start: u64, len: u64 },
144 None,
145}