1use std::{num::NonZeroU32, sync::Arc};
2
3#[derive(Clone, Debug)]
4pub struct HighlightMap(Arc<[Option<HighlightId>]>);
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7pub struct HighlightId(NonZeroU32);
8
9impl HighlightId {
10 pub const TABSTOP_INSERT_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 1).unwrap());
11 pub const TABSTOP_REPLACE_ID: HighlightId = HighlightId(NonZeroU32::new(u32::MAX - 2).unwrap());
12
13 pub fn new(capture_id: u32) -> Self {
14 Self(NonZeroU32::new(capture_id + 1).unwrap_or(NonZeroU32::MAX))
15 }
16}
17
18impl From<HighlightId> for usize {
19 fn from(value: HighlightId) -> Self {
20 value.0.get() as usize - 1
21 }
22}
23
24impl HighlightMap {
25 #[inline]
26 pub fn from_ids(highlight_ids: impl IntoIterator<Item = Option<HighlightId>>) -> Self {
27 Self(highlight_ids.into_iter().collect())
28 }
29
30 #[inline]
31 pub fn get(&self, capture_id: u32) -> Option<HighlightId> {
32 self.0.get(capture_id as usize).copied().flatten()
33 }
34}
35
36impl Default for HighlightMap {
37 fn default() -> Self {
38 Self(Arc::new([]))
39 }
40}