use std::{num::NonZeroU32, sync::Arc}; #[derive(Clone, Debug)] pub struct HighlightMap(Arc<[Option]>); #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct HighlightId(NonZeroU32); impl HighlightId { pub const TABSTOP_INSERT_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 1).unwrap()); pub const TABSTOP_REPLACE_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 2).unwrap()); pub fn new(capture_id: u32) -> Self { Self(NonZeroU32::new(capture_id + 1).unwrap_or(NonZeroU32::MAX)) } } impl From for usize { fn from(value: HighlightId) -> Self { value.0.get() as usize - 1 } } impl HighlightMap { #[inline] pub fn from_ids(highlight_ids: impl IntoIterator>) -> Self { Self(highlight_ids.into_iter().collect()) } #[inline] pub fn get(&self, capture_id: u32) -> Option { self.0.get(capture_id as usize).copied().flatten() } } impl Default for HighlightMap { fn default() -> Self { Self(Arc::new([])) } }