Struct Delta
pub struct Delta<N>where
N: NodeInfo,{
pub els: Vec<DeltaElement<N>>,
pub base_len: usize,
}Expand description
Represents changes to a document by describing the new document as a sequence of sections copied from the old document and of new inserted text. Deletions are represented by gaps in the ranges copied from the old document.
For example, Editing “abcd” into “acde” could be represented as:
[Copy(0,1),Copy(2,4),Insert("e")]
Fields§
§els: Vec<DeltaElement<N>>§base_len: usizeImplementations§
§impl<N> Delta<N>where
N: NodeInfo,
impl<N> Delta<N>where
N: NodeInfo,
pub fn simple_edit<T>(interval: T, rope: Node<N>, base_len: usize) -> Delta<N>where
T: IntervalBounds,
pub fn as_simple_insert(&self) -> Option<&Node<N>>
pub fn as_simple_insert(&self) -> Option<&Node<N>>
If this delta represents a simple insertion, returns the inserted node.
pub fn is_simple_delete(&self) -> bool
pub fn is_simple_delete(&self) -> bool
Returns true if this delta represents a single deletion without
any insertions.
Note that this is false for the trivial delta, as well as for a deletion
from an empty Rope.
pub fn is_identity(&self) -> bool
pub fn is_identity(&self) -> bool
Returns true if applying the delta will cause no change.
pub fn apply(&self, base: &Node<N>) -> Node<N>
pub fn apply(&self, base: &Node<N>) -> Node<N>
Apply the delta to the given rope. May not work well if the length of the rope is not compatible with the construction of the delta.
pub fn factor(self) -> (InsertDelta<N>, Subset)
pub fn factor(self) -> (InsertDelta<N>, Subset)
Factor the delta into an insert-only delta and a subset representing deletions. Applying the insert then the delete yields the same result as the original delta:
fn test_factor(d : &Delta<RopeInfo>, r : &Rope) {
let (ins, del) = d.clone().factor();
let del2 = del.transform_expand(&ins.inserted_subset());
assert_eq!(String::from(del2.delete_from(&ins.apply(r))), String::from(d.apply(r)));
}pub fn synthesize(
tombstones: &Node<N>,
from_dels: &Subset,
to_dels: &Subset,
) -> Delta<N>
pub fn synthesize( tombstones: &Node<N>, from_dels: &Subset, to_dels: &Subset, ) -> Delta<N>
Synthesize a delta from a “union string” and two subsets: an old set
of deletions and a new set of deletions from the union. The Delta is
from text to text, not union to union; anything in both subsets will
be assumed to be missing from the Delta base and the new text. You can
also think of these as a set of insertions and one of deletions, with
overlap doing nothing. This is basically the inverse of factor.
Since only the deleted portions of the union string are necessary,
instead of requiring a union string the function takes a tombstones
rope which contains the deleted portions of the union string. The
from_dels subset must be the interleaving of tombstones into the
union string.
fn test_synthesize(d : &Delta<RopeInfo>, r : &Rope) {
let (ins_d, del) = d.clone().factor();
let ins = ins_d.inserted_subset();
let del2 = del.transform_expand(&ins);
let r2 = ins_d.apply(&r);
let tombstones = ins.complement().delete_from(&r2);
let d2 = Delta::synthesize(&tombstones, &ins, &del);
assert_eq!(String::from(d2.apply(r)), String::from(d.apply(r)));
}pub fn summary(&self) -> (Interval, usize)
pub fn summary(&self) -> (Interval, usize)
Produce a summary of the delta. Everything outside the returned interval is unchanged, and the old contents of the interval are replaced by new contents of the returned length. Equations:
(iv, new_len) = self.summary()
new_s = self.apply(s)
new_s = simple_edit(iv, new_s.subseq(iv.start(), iv.start() + new_len), s.len()).apply(s)
pub fn new_document_len(&self) -> usize
pub fn new_document_len(&self) -> usize
Returns the length of the new document. In other words, the length of the transformed string after this Delta is applied.
d.apply(r).len() == d.new_document_len()
pub fn inserts_len(&self) -> usize
pub fn inserts_len(&self) -> usize
Returns the sum length of the inserts of the delta.
pub fn iter_inserts(&self) -> InsertsIter<'_, N> ⓘ
pub fn iter_inserts(&self) -> InsertsIter<'_, N> ⓘ
Iterates over all the inserts of the delta.
pub fn iter_deletions(&self) -> DeletionsIter<'_, N> ⓘ
pub fn iter_deletions(&self) -> DeletionsIter<'_, N> ⓘ
Iterates over all the deletions of the delta.
Trait Implementations§
§impl<'de> Deserialize<'de> for Delta<RopeInfo>
impl<'de> Deserialize<'de> for Delta<RopeInfo>
§fn deserialize<D>(
deserializer: D,
) -> Result<Delta<RopeInfo>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Delta<RopeInfo>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
§impl Serialize for Delta<RopeInfo>
impl Serialize for Delta<RopeInfo>
§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Auto Trait Implementations§
impl<N> Freeze for Delta<N>
impl<N> RefUnwindSafe for Delta<N>
impl<N> Send for Delta<N>
impl<N> Sync for Delta<N>
impl<N> Unpin for Delta<N>
impl<N> UnsafeUnpin for Delta<N>
impl<N> UnwindSafe for Delta<N>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more