use crate::*; use std::fmt::Debug; pub struct ValueStream(pub Box + Send + 'static>); impl ValueStream { pub fn into_string(self) -> String { format!( "[{}]", self.map(|x: Value| x.into_string()) .collect::>() .join(", ") ) } pub fn collect_string(self) -> String { self.map(|x: Value| x.collect_string()) .collect::>() .join("\n") } pub fn from_stream(input: impl Iterator + Send + 'static) -> ValueStream { ValueStream(Box::new(input)) } } impl Debug for ValueStream { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ValueStream").finish() } } impl Iterator for ValueStream { type Item = Value; fn next(&mut self) -> Option { { self.0.next() } } } // impl Serialize for ValueStream { // fn serialize(&self, serializer: S) -> Result // where // S: serde::Serializer, // { // let mut seq = serializer.serialize_seq(None)?; // for element in self.0.borrow_mut().into_iter() { // seq.serialize_element(&element)?; // } // seq.end() // } // } // impl<'de> Deserialize<'de> for ValueStream { // fn deserialize(deserializer: D) -> Result // where // D: serde::Deserializer<'de>, // { // deserializer.deserialize_seq(MySeqVisitor) // } // } // struct MySeqVisitor; // impl<'a> serde::de::Visitor<'a> for MySeqVisitor { // type Value = ValueStream; // fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { // formatter.write_str("a value stream") // } // fn visit_seq(self, mut seq: A) -> Result // where // A: serde::de::SeqAccess<'a>, // { // let mut output: Vec = vec![]; // while let Some(value) = seq.next_element()? { // output.push(value); // } // Ok(ValueStream(Rc::new(RefCell::new(output.into_iter())))) // } // } // pub trait IntoValueStream { // fn into_value_stream(self) -> ValueStream; // } // impl IntoValueStream for T // where // T: Iterator + 'static, // { // fn into_value_stream(self) -> ValueStream { // ValueStream::from_stream(self) // } // }