After some discussion with PVH I realise that the repo structure in the last reorg was very rust-centric. In an attempt to put each language on a level footing move the rust code and project files into ./rust
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use crate::exid::ExId;
 | 
						|
use crate::{Automerge, Value};
 | 
						|
use std::fmt;
 | 
						|
 | 
						|
pub struct Values<'a> {
 | 
						|
    range: Box<dyn 'a + ValueIter<'a>>,
 | 
						|
    doc: &'a Automerge,
 | 
						|
}
 | 
						|
 | 
						|
impl<'a> fmt::Debug for Values<'a> {
 | 
						|
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 | 
						|
        f.debug_struct("Values").finish()
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
pub(crate) trait ValueIter<'a> {
 | 
						|
    fn next_value(&mut self, doc: &'a Automerge) -> Option<(Value<'a>, ExId)>;
 | 
						|
}
 | 
						|
 | 
						|
pub(crate) struct NoValues {}
 | 
						|
 | 
						|
impl<'a> ValueIter<'a> for NoValues {
 | 
						|
    fn next_value(&mut self, _doc: &'a Automerge) -> Option<(Value<'a>, ExId)> {
 | 
						|
        None
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<'a> Values<'a> {
 | 
						|
    pub(crate) fn new<R: 'a + ValueIter<'a>>(doc: &'a Automerge, range: Option<R>) -> Self {
 | 
						|
        if let Some(range) = range {
 | 
						|
            Self {
 | 
						|
                range: Box::new(range),
 | 
						|
                doc,
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            Self::empty(doc)
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    pub(crate) fn empty(doc: &'a Automerge) -> Self {
 | 
						|
        Self {
 | 
						|
            range: Box::new(NoValues {}),
 | 
						|
            doc,
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<'a> Iterator for Values<'a> {
 | 
						|
    type Item = (Value<'a>, ExId);
 | 
						|
 | 
						|
    fn next(&mut self) -> Option<Self::Item> {
 | 
						|
        self.range.next_value(self.doc)
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<'a> DoubleEndedIterator for Values<'a> {
 | 
						|
    fn next_back(&mut self) -> Option<Self::Item> {
 | 
						|
        unimplemented!()
 | 
						|
    }
 | 
						|
}
 |