diff --git a/Cargo.lock b/Cargo.lock index b0e14dbe7..794b75ed0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,15 +20,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "archery" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a8da9bc4c4053ee067669762bcaeea6e241841295a2b6c948312dad6ef4cc02" -dependencies = [ - "static_assertions", -] - [[package]] name = "atty" version = "0.2.14" @@ -204,7 +195,6 @@ dependencies = [ "radix-heap", "rayon", "regex", - "rpds", "rustc-hash", "strsim", "term_size", @@ -535,15 +525,6 @@ version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" -[[package]] -name = "rpds" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054e417ded02a19ae192c8c89412eaec7d1c2cdd826aa412565761d86ca6315e" -dependencies = [ - "archery", -] - [[package]] name = "rustc-hash" version = "1.1.0" @@ -579,12 +560,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" diff --git a/Cargo.toml b/Cargo.toml index d1cc8ee7a..b3db13bf4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,7 +42,6 @@ walkdir = "2.3.2" terminal_size = "0.2.1" const_format = "0.2.22" owo-colors = "3.3.0" -rpds = "0.10.0" wu-diff = "0.1.2" rayon = "1.5.2" tree_magic_mini = "3.0.3" diff --git a/src/diff/graph.rs b/src/diff/graph.rs index db00be25c..f68e65556 100644 --- a/src/diff/graph.rs +++ b/src/diff/graph.rs @@ -1,7 +1,6 @@ //! A graph representation for computing tree diffs. use bumpalo::Bump; -use rpds::Stack; use rustc_hash::FxHashMap; use std::{ cell::RefCell, @@ -12,7 +11,10 @@ use std::{ use strsim::normalized_levenshtein; use crate::{ - diff::changes::{insert_deep_unchanged, ChangeKind, ChangeMap}, + diff::{ + changes::{insert_deep_unchanged, ChangeKind, ChangeMap}, + stack::Stack, + }, parse::syntax::{AtomKind, Syntax, SyntaxId}, }; use Edge::*; diff --git a/src/diff/mod.rs b/src/diff/mod.rs index 44f10e6c7..4bd7efd03 100644 --- a/src/diff/mod.rs +++ b/src/diff/mod.rs @@ -3,4 +3,5 @@ pub mod dijkstra; mod graph; pub mod myers_diff; pub mod sliders; +mod stack; pub mod unchanged; diff --git a/src/diff/stack.rs b/src/diff/stack.rs new file mode 100644 index 000000000..6bf35de1d --- /dev/null +++ b/src/diff/stack.rs @@ -0,0 +1,48 @@ +use std::rc::Rc; + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +struct Node { + val: T, + next: Option>>, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct Stack { + head: Option>>, + len: usize, +} + +impl Stack { + pub fn new() -> Self { + Self { head: None, len: 0 } + } + + pub fn peek(&self) -> Option<&T> { + self.head.as_deref().map(|n| &n.val) + } + + pub fn pop(&self) -> Option> { + self.head.as_deref().map(|n| Self { + head: n.next.clone(), + len: self.len - 1, + }) + } + + pub fn push(&self, v: T) -> Stack { + Self { + head: Some(Rc::new(Node { + val: v, + next: self.head.clone(), + })), + len: self.len + 1, + } + } + + pub fn size(&self) -> usize { + self.len + } + + pub fn is_empty(&self) -> bool { + self.len == 0 + } +}