Skip to main content

Delta

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: usize

Implementations§

§

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>>

If this delta represents a simple insertion, returns the inserted node.

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

Returns true if applying the delta will cause no change.

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)

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>

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)

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

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

Returns the sum length of the inserts of the delta.

pub fn iter_inserts(&self) -> InsertsIter<'_, N>

Iterates over all the inserts of the delta.

pub fn iter_deletions(&self) -> DeletionsIter<'_, N>

Iterates over all the deletions of the delta.

Trait Implementations§

§

impl<N> Clone for Delta<N>
where N: Clone + NodeInfo,

§

fn clone(&self) -> Delta<N>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<N> Debug for Delta<N>
where N: NodeInfo, Node<N>: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'de> Deserialize<'de> for Delta<RopeInfo>

§

fn deserialize<D>( deserializer: D, ) -> Result<Delta<RopeInfo>, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl From<RopeDelta_> for Delta<RopeInfo>

§

fn from(delta: RopeDelta_) -> Delta<RopeInfo>

Converts to this type from the input type.
§

impl Serialize for Delta<RopeInfo>

§

fn serialize<S>( &self, serializer: S, ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<N> Freeze for Delta<N>

§

impl<N> RefUnwindSafe for Delta<N>

§

impl<N> Send for Delta<N>
where N: Sync + Send, <N as NodeInfo>::L: Sync + Send,

§

impl<N> Sync for Delta<N>
where N: Sync + Send, <N as NodeInfo>::L: Sync + Send,

§

impl<N> Unpin for Delta<N>

§

impl<N> UnsafeUnpin for Delta<N>

§

impl<N> UnwindSafe for Delta<N>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast<T> for T

§

fn downcast(&self) -> &T

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> Upcast<T> for T

§

fn upcast(&self) -> Option<&T>

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSend for T
where T: Send,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSendSync for T
where T: WasmNotSend + WasmNotSync,

§

impl<T> WasmNotSync for T
where T: Sync,

§

impl<T> WasmNotSync for T
where T: Sync,