Skip to content

Commit c8ce624

Browse files
committed
comment
1 parent b448786 commit c8ce624

File tree

1 file changed

+82
-0
lines changed
  • libs/disjoint_intervals/src

1 file changed

+82
-0
lines changed

libs/disjoint_intervals/src/lib.rs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,28 @@ use std::{
44
ops::Range,
55
};
66

7+
/// 互いに素な区間を管理するデータ構造
78
#[derive(Clone, PartialEq, Eq)]
89
pub struct DisjointIntervals<T> {
910
// [start, end)
1011
intervals: BTreeMap<T, T>,
1112
}
1213

14+
/// 区間を挿入したときに触った各部分区間の状態を表す
1315
#[derive(Debug, Clone, PartialEq, Eq)]
1416
pub enum InsertItem<T> {
17+
/// 新しく挿入された区間
1518
New(Range<T>),
19+
/// 既存の区間と重なった区間
1620
Overlap(Range<T>),
1721
}
1822

23+
/// 区間を削除したときに触った各部分区間の状態を表す
1924
#[derive(Debug, Clone, PartialEq, Eq)]
2025
pub enum RemoveItem<T> {
26+
/// 削除された区間
2127
Remove(Range<T>),
28+
/// 元々存在しなかった区間
2229
Absent(Range<T>),
2330
}
2431

@@ -44,6 +51,28 @@ where
4451
self.intervals.iter().map(|(&start, &end)| start..end)
4552
}
4653

54+
/// 区間を追加する
55+
///
56+
/// 初期値 `init,` 関数 `f` による畳み込み結果を返す
57+
///
58+
/// # Examples
59+
///
60+
/// ```
61+
/// use disjoint_intervals::{DisjointIntervals, InsertItem};
62+
///
63+
/// let mut intervals = DisjointIntervals::<i32>::new();
64+
/// intervals.insert(-10..5, (), |_, _| ());
65+
/// let overlapped = intervals.insert(0..10, 0, |acc, item| {
66+
/// if let InsertItem::Overlap(item) = item {
67+
/// acc + (item.end - item.start)
68+
/// } else {
69+
/// acc
70+
/// }
71+
/// });
72+
/// assert_eq!(overlapped, 5);
73+
///
74+
/// assert_eq!(intervals.iter().collect::<Vec<_>>(), vec![-10..10]);
75+
/// ```
4776
pub fn insert<U, F>(&mut self, interval: Range<T>, init: U, f: F) -> U
4877
where
4978
F: FnMut(U, InsertItem<T>) -> U,
@@ -97,6 +126,28 @@ where
97126
acc
98127
}
99128

129+
/// 区間を削除する
130+
///
131+
/// 初期値 `init,` 関数 `f` による畳み込み結果を返す
132+
///
133+
/// # Examples
134+
///
135+
/// ```
136+
/// use disjoint_intervals::{DisjointIntervals, RemoveItem};
137+
///
138+
/// let mut intervals = DisjointIntervals::<i32>::new();
139+
/// intervals.insert(-10..5, (), |_, _| ());
140+
/// let removed = intervals.remove(-5..10, 0, |acc, item| {
141+
/// if let RemoveItem::Remove(item) = item {
142+
/// acc + (item.end - item.start)
143+
/// } else {
144+
/// acc
145+
/// }
146+
/// });
147+
/// assert_eq!(removed, 10);
148+
///
149+
/// assert_eq!(intervals.iter().collect::<Vec<_>>(), vec![-10..-5]);
150+
/// ```
100151
pub fn remove<U, F>(&mut self, interval: Range<T>, init: U, f: F) -> U
101152
where
102153
F: FnMut(U, RemoveItem<T>) -> U,
@@ -156,13 +207,44 @@ where
156207
acc
157208
}
158209

210+
/// `x` 以上の開始点を持つ最初の区間を返す
211+
///
212+
/// # Examples
213+
///
214+
/// ```
215+
/// use disjoint_intervals::DisjointIntervals;
216+
///
217+
/// let mut intervals = DisjointIntervals::<i32>::new();
218+
/// intervals.insert(0..5, (), |_, _| ());
219+
/// intervals.insert(10..15, (), |_, _| ());
220+
///
221+
/// assert_eq!(intervals.ge(0), Some(0..5));
222+
/// assert_eq!(intervals.ge(3), Some(10..15));
223+
/// assert_eq!(intervals.ge(15), None);
224+
/// ```
159225
pub fn ge(&self, x: T) -> Option<Range<T>> {
160226
self.intervals
161227
.range(x..)
162228
.next()
163229
.map(|(&start, &end)| start..end)
164230
}
165231

232+
/// `x` 以下の開始点を持つ最後の区間を返す
233+
///
234+
/// # Examples
235+
///
236+
/// ```
237+
/// use disjoint_intervals::DisjointIntervals;
238+
///
239+
/// let mut intervals = DisjointIntervals::<i32>::new();
240+
/// intervals.insert(0..5, (), |_, _| ());
241+
/// intervals.insert(10..15, (), |_, _| ());
242+
///
243+
/// assert_eq!(intervals.le(12), Some(10..15));
244+
/// assert_eq!(intervals.le(10), Some(10..15));
245+
/// assert_eq!(intervals.le(5), Some(0..5));
246+
/// assert_eq!(intervals.le(-1), None);
247+
/// ```
166248
pub fn le(&self, x: T) -> Option<Range<T>> {
167249
self.intervals
168250
.range(..=x)

0 commit comments

Comments
 (0)