@@ -4,21 +4,28 @@ use std::{
44 ops:: Range ,
55} ;
66
7+ /// 互いに素な区間を管理するデータ構造
78#[ derive( Clone , PartialEq , Eq ) ]
89pub struct DisjointIntervals < T > {
910 // [start, end)
1011 intervals : BTreeMap < T , T > ,
1112}
1213
14+ /// 区間を挿入したときに触った各部分区間の状態を表す
1315#[ derive( Debug , Clone , PartialEq , Eq ) ]
1416pub enum InsertItem < T > {
17+ /// 新しく挿入された区間
1518 New ( Range < T > ) ,
19+ /// 既存の区間と重なった区間
1620 Overlap ( Range < T > ) ,
1721}
1822
23+ /// 区間を削除したときに触った各部分区間の状態を表す
1924#[ derive( Debug , Clone , PartialEq , Eq ) ]
2025pub enum RemoveItem < T > {
26+ /// 削除された区間
2127 Remove ( Range < T > ) ,
28+ /// 元々存在しなかった区間
2229 Absent ( Range < T > ) ,
2330}
2431
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