use crate::collect_s::Collectable; use crate::collect_s::Collected; use crate::streamitem::RangeCompletableItem; use crate::streamitem::Sitemty; use crate::streamitem::StreamItem; use crate::timebin::TimeBinnable; use crate::Events; use err::Error; use futures_util::stream; use futures_util::Future; use futures_util::Stream; use futures_util::StreamExt; use std::pin::Pin; use std::task::Context; use std::task::Poll; pub trait EventStreamTrait: Stream>> + WithTransformProperties + Send {} pub trait TimeBinnableStreamTrait: Stream>> + WithTransformProperties + Send { } pub trait CollectableStreamTrait: Stream>> + WithTransformProperties + Send { } pub struct EventTransformProperties { pub needs_value: bool, } pub struct TransformProperties { pub needs_one_before_range: bool, pub needs_value: bool, } pub trait WithTransformProperties { fn query_transform_properties(&self) -> TransformProperties; } impl WithTransformProperties for Box where T: WithTransformProperties, { fn query_transform_properties(&self) -> TransformProperties { self.as_ref().query_transform_properties() } } impl WithTransformProperties for Pin> where T: WithTransformProperties, { fn query_transform_properties(&self) -> TransformProperties { self.as_ref().query_transform_properties() } } pub trait EventTransform: WithTransformProperties + Send { fn transform(&mut self, src: Box) -> Box; } impl EventTransform for Box where T: EventTransform, { fn transform(&mut self, src: Box) -> Box { self.as_mut().transform(src) } } impl EventTransform for Pin> where T: EventTransform, { fn transform(&mut self, src: Box) -> Box { todo!() } } pub struct IdentityTransform {} impl IdentityTransform { pub fn default() -> Self { Self {} } } impl WithTransformProperties for IdentityTransform { fn query_transform_properties(&self) -> TransformProperties { todo!() } } impl EventTransform for IdentityTransform { fn transform(&mut self, src: Box) -> Box { src } } pub struct TransformEvent(pub Box); impl WithTransformProperties for TransformEvent { fn query_transform_properties(&self) -> TransformProperties { self.0.query_transform_properties() } } impl EventTransform for TransformEvent { fn transform(&mut self, src: Box) -> Box { self.0.transform(src) } } impl WithTransformProperties for stream::Iter { fn query_transform_properties(&self) -> TransformProperties { todo!() } } impl EventStreamTrait for stream::Iter where T: core::iter::Iterator>> + Send { } pub struct EventStreamBox(pub Pin>); impl From for EventStreamBox where T: Events, { fn from(value: T) -> Self { let item = Ok(StreamItem::DataItem(RangeCompletableItem::Data(Box::new(value) as _))); let x = stream::iter(vec![item]); Self(Box::pin(x)) } } pub struct TimeBinnableStreamBox(pub Pin>); impl WithTransformProperties for TimeBinnableStreamBox { fn query_transform_properties(&self) -> TransformProperties { self.0.query_transform_properties() } } impl Stream for TimeBinnableStreamBox { type Item = ::Item; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { self.0.poll_next_unpin(cx) } } impl TimeBinnableStreamTrait for TimeBinnableStreamBox {} pub struct CollectableStreamBox(pub Pin>); impl Stream for CollectableStreamBox { type Item = Sitemty>; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { self.0.poll_next_unpin(cx) } } impl WithTransformProperties for CollectableStreamBox { fn query_transform_properties(&self) -> TransformProperties { todo!() } } impl CollectableStreamTrait for CollectableStreamBox {} impl WithTransformProperties for stream::Empty { fn query_transform_properties(&self) -> TransformProperties { todo!() } } impl CollectableStreamTrait for stream::Empty where T: Send, stream::Empty: Stream>>, { } impl CollectableStreamTrait for Pin> where T: CollectableStreamTrait {}