unobtanium_segmenter/chain/
segmenter.rs

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