Date: 2025-10-24 Purpose: Identify beneficial features from the Java version that could enhance the Rust implementation
The Rust implementation has excellent feature parity with the Java version for core functionality, and has already surpassed the Java version in several areas through the recent optimization work (40-60% performance improvements). However, there are some beneficial features from the Java version that could enhance the Rust implementation.
| Feature | Java | Rust | Notes |
|---|---|---|---|
| Standard Levenshtein | ✅ | ✅ | Both have full implementation |
| Transposition | ✅ | ✅ | Optimal string alignment (restricted Damerau) |
| Merge/Split | ✅ | ✅ | Both fully implemented |
| Candidate with distance | ✅ | ✅ | Both return term + distance |
| Dictionary abstraction | ✅ | ✅ | Java: IDictionary, Rust: Dictionary trait |
| Lazy evaluation | ✅ | ✅ | Both use iterators |
| State pooling | ✅ | ✅ | Rust recently added in Phase 5! |
| Transducer queries | ✅ | ✅ | Core functionality matches |
Java Implementation:
ProtobufSerializer - Binary serialization using Protocol BuffersBytecodeSerializer - JVM bytecode serializationPlainTextSerializer - Text file serializationBenefit for Rust:
Recommended Implementation:
// Using serde for flexibility
pub trait DictionarySerializer {
fn serialize<W: Write>(&self, dict: &impl Dictionary, writer: W) -> Result<()>;
fn deserialize<R: Read>(reader: R) -> Result<Box<dyn Dictionary>>;
}
// Implementations:
// 1. BincodeSerializer (fast binary)
// 2. JsonSerializer (human-readable)
// 3. MessagePackSerializer (compact)
Priority: HIGH - Would significantly improve production usability
Java Implementation:
SortedDawg - Directed Acyclic Word GraphBenefit for Rust:
Current Rust Status:
PathMapDictionary (Trie-based using PathMap)Recommended Implementation:
pub struct DawgDictionary {
// Minimal automaton representation
// Share common suffixes
// Ideal for sorted dictionaries
}
Priority: HIGH - Provides important alternative to PathMap
Java Implementation:
final ITransducer<Candidate> transducer =
new TransducerBuilder()
.dictionary(dictionary)
.algorithm(Algorithm.TRANSPOSITION)
.defaultMaxDistance(2)
.includeDistance(true)
.build();
Benefit for Rust:
Current Rust Status:
// Currently: Direct construction
let transducer = Transducer::new(dict, Algorithm::Transposition);
Recommended Implementation:
let transducer = TransducerBuilder::new()
.dictionary(dict)
.algorithm(Algorithm::Transposition)
.max_distance(2)
.build()?;
Priority: MEDIUM - Nice-to-have for API improvement
Java Implementation:
Current Rust Status:
Priority: LOW - Rust already has superior benchmarking
Java Implementation:
liblevenshtein-java-cli - Separate CLI toolBenefit for Rust:
Recommended Implementation:
// examples/cli.rs or separate binary crate
liblevenshtein query --dict words.txt --term "test" --distance 2
liblevenshtein server --dict words.txt --port 8080
Priority: LOW - Nice-to-have utility, not core library feature
Rust Advantages:
Java Status:
Result: Rust is likely significantly faster than Java after recent optimizations!
Rust Advantages:
Java Limitations:
Rust Advantages:
Java Limitations:
Dictionary Serialization (2-3 weeks)
DAWG Dictionary (3-4 weeks)
liblevenshtein-cli binaryThe Rust implementation has excellent core feature parity with the Java version and has exceeded it in several critical areas (performance, type safety, memory safety). The primary gaps are:
High Priority:
Medium Priority: 3. Builder pattern (API ergonomics)
Low Priority: 4. CLI tool (utility, not core library)
The Rust version is in excellent shape and the recent optimization work (Phases 1-6) has likely made it significantly faster than the Java version. The recommended additions would make it even more production-ready and feature-complete.
com.github.liblevenshtein/
├── collection/
│ ├── dictionary/
│ │ ├── SortedDawg.java
│ │ ├── Dawg.java
│ │ ├── DawgNode.java
│ │ ├── FinalDawgNode.java
│ │ └── factory/
│ │ └── DawgFactory.java
│ └── AbstractIterator.java
├── distance/
│ ├── IDistance.java
│ ├── StandardDistance.java
│ └── TranspositionDistance.java
├── serialization/
│ ├── Serializer.java
│ ├── ProtobufSerializer.java
│ ├── BytecodeSerializer.java
│ └── PlainTextSerializer.java
└── transducer/
├── Algorithm.java
├── Candidate.java
├── ITransducer.java
├── Transducer.java
├── State.java
├── Position.java
└── factory/
├── TransducerBuilder.java
├── StateFactory.java
└── CandidateFactory.java
liblevenshtein/
├── dictionary/
│ ├── mod.rs (Dictionary, DictionaryNode traits)
│ └── pathmap.rs (PathMapDictionary)
├── distance/
│ └── mod.rs (standard_distance, transposition_distance)
└── transducer/
├── algorithm.rs
├── candidate.rs (Candidate struct)
├── mod.rs (Transducer)
├── query.rs (QueryIterator, CandidateIterator)
├── state.rs
├── position.rs
├── pool.rs (StatePool - Phase 5 addition!)
├── intersection.rs
└── transition.rs
Missing from Rust:
serialization/ moduledictionary/dawg.rs implementationCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |