unobtanium_segmenter/chain/
segmenter.rs

1use crate::segmentation::Segmenter;
2use crate::SegmentedToken;
3use crate::SubdivisionMap;
4
5/// Allows easily applying a [Segmenter] to an iterator of tokens.
6///
7/// If your Segmenter is also an [Augmenter][crate::augmentation::Augmenter] please use [ChainAugmenter][crate::chain::ChainAugmenter] instead.
8///
9/// It can be used on any iterator that has [SegmentedToken] as its `item`.
10pub trait ChainSegmenter<'a, S: Segmenter>
11where
12	Self: 'a,
13{
14	/// Process the iterator using a segmenter
15	fn chain_segmenter(self, segmenter: &S) -> impl Iterator<Item = SegmentedToken<'a>>;
16
17	/// Process the iterator using a segmenter
18	fn chain_owned_segmenter(self, segmenter: S) -> impl Iterator<Item = SegmentedToken<'a>>;
19
20}
21
22impl<'a, S: Segmenter + 'a, I: Iterator<Item = SegmentedToken<'a>>> ChainSegmenter<'a, S> for I
23where
24	Self: 'a,
25{
26	fn chain_segmenter(self, segmenter: &S) -> impl Iterator<Item = SegmentedToken<'a>> {
27		return SubdivisionMap::new(self, |t| segmenter.subdivide(t));
28	}
29
30	fn chain_owned_segmenter(self, segmenter: S) -> impl Iterator<Item = SegmentedToken<'a>> {
31		return SubdivisionMap::new(self, move |t| segmenter.subdivide(t));
32	}
33
34}