use crate::LimitInfo;
use std::time::Duration;
const TOTAL_SLICE: Duration = Duration::from_millis(100);
impl Default for LimitInfo {
fn default() -> Self {
Self {
current_usage: 0.0,
target_usage: 0.0,
last_work_slice: TOTAL_SLICE,
total_slice: TOTAL_SLICE,
}
}
}
impl LimitInfo {
pub fn new(current_usage: f32, target_usage: f32, last_work_slice: Duration) -> Self {
LimitInfo {
current_usage,
target_usage,
last_work_slice,
total_slice: TOTAL_SLICE,
}
}
pub fn update_current_usage(&mut self, usage: f32) {
self.current_usage = usage;
}
pub fn update_taregt_usage(&mut self, usage: f32) {
self.target_usage = usage;
}
pub fn update_work_slice(&mut self, work_slice: Duration) {
self.last_work_slice = work_slice;
}
pub fn total_slice(&self) -> Duration {
self.total_slice
}
pub fn result(&mut self) -> (Duration, Duration, Duration) {
let mut work_slice_per = self.current_usage / self.target_usage;
if work_slice_per > 1.0 {
work_slice_per = 1.0;
} else if work_slice_per < 0.0 {
work_slice_per = 0.0;
}
let work_slice = self.last_work_slice.mul_f32(work_slice_per);
let sleep_slice = self.total_slice - work_slice;
(work_slice, sleep_slice, self.total_slice)
}
}