use std::sync::{Arc, RwLock};

use super::Capture;

/// Capture layer state.
pub struct State {
	pub(super) active: RwLock<Vec<Arc<Capture>>>,
}

impl Default for State {
	fn default() -> Self { Self::new() }
}

impl State {
	#[must_use]
	pub fn new() -> Self { Self { active: RwLock::new(Vec::new()) } }

	pub(super) fn add(&self, capture: &Arc<Capture>) {
		self.active
			.write()
			.expect("locked for writing")
			.push(capture.clone());
	}

	pub(super) fn del(&self, capture: &Arc<Capture>) {
		let mut vec = self.active.write().expect("locked for writing");
		if let Some(pos) = vec.iter().position(|v| Arc::ptr_eq(v, capture)) {
			vec.swap_remove(pos);
		}
	}
}
