feat(downloads): Added Download Manager

Signed-off-by: quexeky <git@quexeky.dev>
This commit is contained in:
quexeky
2024-11-13 20:38:00 +11:00
parent 3dbf5ab573
commit a1ada07690
7 changed files with 206 additions and 47 deletions

View File

@ -1,33 +1,44 @@
use std::sync::{
atomic::{AtomicUsize, Ordering},
Arc,
Arc, Mutex,
};
#[derive(Clone)]
pub struct ProgressObject {
max: usize,
progress_instances: Arc<Vec<Arc<AtomicUsize>>>,
max: Arc<Mutex<usize>>,
progress_instances: Arc<Mutex<Vec<Arc<AtomicUsize>>>>,
}
impl ProgressObject {
pub fn new(max: usize, length: usize) -> Self {
let arr = (0..length).map(|_| Arc::new(AtomicUsize::new(0))).collect();
let arr = Mutex::new((0..length).map(|_| Arc::new(AtomicUsize::new(0))).collect());
Self {
max,
max: Arc::new(Mutex::new(max)),
progress_instances: Arc::new(arr),
}
}
pub fn sum(&self) -> usize {
self.progress_instances
.lock()
.unwrap()
.iter()
.map(|instance| instance.load(Ordering::Relaxed))
.sum()
}
pub fn get_max(&self) -> usize {
self.max.lock().unwrap().clone()
}
pub fn set_max(&self, new_max: usize) {
*self.max.lock().unwrap() = new_max
}
pub fn set_size(&self, length: usize) {
*self.progress_instances.lock().unwrap() = (0..length).map(|_| Arc::new(AtomicUsize::new(0))).collect();
}
pub fn get_progress(&self) -> f64 {
self.sum() as f64 / self.max as f64
self.sum() as f64 / self.get_max() as f64
}
pub fn get(&self, index: usize) -> Arc<AtomicUsize> {
self.progress_instances[index].clone()
self.progress_instances.lock().unwrap()[index].clone()
}
}