Switching things to tagged type

This commit is contained in:
2026-03-20 20:22:36 +01:00
parent 822cdc1587
commit ac5c9eeaa0
6 changed files with 254 additions and 154 deletions

View File

@ -13,6 +13,7 @@ use crate::stream::StreamReader;
use crate::stream::StreamWriter;
use crate::stream::{self};
use crate::tag::Tag;
use crate::tag::Tagged;
pub struct In<T>
{
@ -173,7 +174,7 @@ impl<T> InReader<'_, T>
self.data_reader.len()
}
pub fn pop_tagged(&self) -> Option<(T, Option<Tag>)>
pub fn pop(&self) -> Option<Tagged<T>>
{
let data = self.data_reader.pop_with_index();
if let Some((data, index)) = data
@ -186,7 +187,7 @@ impl<T> InReader<'_, T>
{
tag = self.tag_reader.pop();
}
Some((data, tag))
Some((data, tag).into())
}
else
{
@ -194,9 +195,9 @@ impl<T> InReader<'_, T>
}
}
pub fn pop_drop_tag(&self) -> Option<T>
pub fn pop_untag(&self) -> Option<T>
{
self.pop_tagged().map(|(data, _)| data)
self.pop().map(|data| data.into_inner())
}
}
@ -207,8 +208,9 @@ impl<T> OutWriter<'_, T>
self.data_writer.len().min(self.tag_writer.len())
}
pub fn push(&self, (data, tag): (T, Option<Tag>)) -> Result<(), (T, Option<Tag>)>
pub fn push(&self, data: Tagged<T>) -> Result<(), (T, Option<Tag>)>
{
let (data, tag) = data.into();
match self.data_writer.push(data)
{
Ok(_) if tag.is_some() =>
@ -221,23 +223,9 @@ impl<T> OutWriter<'_, T>
}
}
pub fn push_tagged(&self, data: T, tag: Tag) -> Result<(), (T, Tag)>
{
let res = self.data_writer.push(data);
match res
{
Ok(_) =>
{
let _ = self.tag_writer.push(tag);
Ok(())
}
Err(t) => Err((t, tag)),
}
}
pub fn push_no_tag(&self, data: T) -> Result<(), T>
{
self.data_writer.push(data)
self.data_writer.push(data.into())
}
}
@ -268,6 +256,7 @@ impl<'a, T: 'static> PopIterable<'a> for In<T>
}
}
generate_pop_iterable_tuple_impl! {1}
generate_pop_iterable_tuple_impl! {2}
generate_pop_iterable_tuple_impl! {3}
generate_pop_iterable_tuple_impl! {4}
@ -279,25 +268,18 @@ generate_pop_iterable_tuple_impl! {9}
generate_pop_iterable_tuple_impl! {10}
generate_pop_iterable_tuple_impl! {11}
generate_pop_iterable_tuple_impl! {12}
generate_pop_iterable_tuple_impl! {13}
generate_pop_iterable_tuple_impl! {14}
generate_pop_iterable_tuple_impl! {15}
generate_pop_iterable_tuple_impl! {16}
generate_pop_iterable_tuple_impl! {17}
generate_pop_iterable_tuple_impl! {18}
generate_pop_iterable_tuple_impl! {19}
generate_pop_iterable_tuple_impl! {20}
impl<'a, T> Iterator for PopIter<InReader<'a, T>>
{
type Item = (T, Option<Tag>);
type Item = Tagged<T>;
fn next(&mut self) -> Option<Self::Item>
{
self.reader.pop_tagged()
self.reader.pop()
}
}
impl_iterator_for_pop_iter_tuple! {1}
impl_iterator_for_pop_iter_tuple! {2}
impl_iterator_for_pop_iter_tuple! {3}
impl_iterator_for_pop_iter_tuple! {4}
@ -309,14 +291,6 @@ impl_iterator_for_pop_iter_tuple! {9}
impl_iterator_for_pop_iter_tuple! {10}
impl_iterator_for_pop_iter_tuple! {11}
impl_iterator_for_pop_iter_tuple! {12}
impl_iterator_for_pop_iter_tuple! {13}
impl_iterator_for_pop_iter_tuple! {14}
impl_iterator_for_pop_iter_tuple! {15}
impl_iterator_for_pop_iter_tuple! {16}
impl_iterator_for_pop_iter_tuple! {17}
impl_iterator_for_pop_iter_tuple! {18}
impl_iterator_for_pop_iter_tuple! {19}
impl_iterator_for_pop_iter_tuple! {20}
// Needed for graph to be able to manipulate
// stream endings without knowing the generic type
@ -375,3 +349,10 @@ impl AnonymousStreamConsumer
)
}
}
// pub trait PushIterable<'a, T, I>
// where
// I: Iterator<Item = T>,
// {
// fn push_iter(&'a mut self, iter: I) -> bool;
// }

View File

@ -77,35 +77,44 @@ impl TagMergable<Option<Tag>> for Option<Tag>
}
}
impl<T: Clone> TagMergable<Option<Tag>> for Tagged<T>
{
fn merge(&self, other: &Option<Tag>) -> Self
{
Tagged::new(self.0.clone(), self.1.merge(other))
}
}
/// Represents a data, with a potential tag attached to it.
#[derive(Clone)]
pub struct Tagged<T>
{
inner: T,
tag: Option<Tag>,
}
pub struct Tagged<T>(pub T, pub Option<Tag>);
impl<T> Tagged<T>
{
pub fn new(inner: T, tag: Option<Tag>) -> Self
{
Self { inner, tag }
Self(inner, tag)
}
pub fn has_tag(&self) -> bool
{
self.tag.is_some()
self.1.is_some()
}
pub fn strip(&mut self)
{
self.tag = None;
self.1 = None;
}
pub fn into_inner(self) -> T
{
self.0
}
pub fn tag(&mut self, tag: Tag) -> Option<Tag>
{
let t = self.tag.take();
self.tag = Some(tag);
let t = self.1.take();
self.1 = Some(tag);
t
}
}
@ -114,12 +123,12 @@ impl<T: Clone> Tagged<T>
{
pub fn stripped(&self) -> Self
{
self.inner.clone().into()
self.0.clone().into()
}
pub fn tagged(&self, tag: Tag) -> Self
{
(self.inner.clone(), tag).into()
(self.0.clone(), tag).into()
}
}
@ -139,11 +148,27 @@ impl<T> From<(T, Tag)> for Tagged<T>
}
}
impl<T> From<(T, Option<Tag>)> for Tagged<T>
{
fn from((value, tag): (T, Option<Tag>)) -> Self
{
Self::new(value, tag)
}
}
impl<T> Into<(T, Option<Tag>)> for Tagged<T>
{
fn into(self) -> (T, Option<Tag>)
{
(self.0, self.1)
}
}
impl<T> DerefMut for Tagged<T>
{
fn deref_mut(&mut self) -> &mut Self::Target
{
&mut self.inner
&mut self.0
}
}
@ -153,6 +178,6 @@ impl<T> Deref for Tagged<T>
fn deref(&self) -> &Self::Target
{
&self.inner
&self.0
}
}