Bamboo Core (Rust)
A high-performance Vietnamese input method engine (IME) core written in Rust, ported from bamboo-core (Go).
Features
- Telex, VNI, VIQR input methods with custom input method support
- Hybrid engine: Rule-based transformations + Lazy JIT DFA caching
- Zero heap allocation in core processing path (stack-allocated buffers)
- O(1) backspace via snapshot stack
- O(N) single-pass spelling validation
- FFI for C/C++ integration and WASM bindings
Installation
[]
= "0.3.9"
Quick Start
use ;
let mut engine = new;
let word = engine.process;
assert_eq!;
engine.reset;
let word2 = engine.process;
assert_eq!;
Incremental Processing
Process keystrokes one at a time for IME integration:
use ;
let mut engine = new;
engine.process_key;
engine.process_key;
engine.process_key;
engine.process_key;
engine.process_key;
engine.process_key;
engine.process_key;
assert_eq!;
Delta Updates
For efficient text editor integration, use process_key_delta to get only the diff:
use ;
let mut engine = new;
let = engine.process_key_delta;
// backspaces = 0, inserted = "a"
let = engine.process_key_delta;
// backspaces = 1, inserted = "á" (replaces "a" with "á")
Backspace
use ;
let mut engine = new;
engine.process_str;
assert_eq!;
engine.remove_last_char;
assert_eq!;
Output Customization
use ;
let mut engine = new;
engine.process_str;
// Toneless
assert_eq!;
// Full text (committed + active)
assert_eq!;
Benchmarks
Benchmarked against uvie v2.1.1 on the same machine. Lower is better.
Core Operations
| Benchmark | Bamboo | Uvie | Speedup |
|---|---|---|---|
| feed single word (tieengs) | 76 ns | 874 ns | 11.5x |
| feed + delta (per key) | 718 ns | 861 ns | 1.2x |
| mixed typing (29 chars) | 904 ns | 3,658 ns | 4.0x |
| many words (13 words) | 6,745 ns | 11,878 ns | 1.8x |
Backspace
| Benchmark | Bamboo | Uvie | Speedup |
|---|---|---|---|
| backspace (1x) | 143 ns | 1,066 ns | 7.5x |
| backspace x3 | 262 ns | 1,372 ns | 5.2x |
| backspace spam (7x) | 405 ns | 1,704 ns | 4.2x |
Real-world Scenarios
| Benchmark | Bamboo | Uvie | Speedup |
|---|---|---|---|
| english passthrough (code) | 348 ns | 1,506 ns | 4.3x |
| long identifier (39 chars) | 566 ns | 10,467 ns | 18.5x |
| commit via space | 167 ns | 868 ns | 5.2x |
| worst-case syllable (nghieengs) | 98 ns | 990 ns | 10.1x |
| random typing (real workload) | 3,892 ns | 8,488 ns | 2.2x |
Note: Bamboo's cold start (first keystroke) is slower (~19 µs vs ~1.5 µs) due to Engine + DFA allocation. After warmup, the DFA fast path dominates.
Run benchmarks: cargo bench
Credits
- Rust Port & Optimization: Dao Trong Nguyen (@nguyen10t2)
- Original Author (Go): Lam (@lamtq)
- Technical Consultant: Mai Tan Phat (@phatMT97) - Author of VKey
License
MIT. See LICENSE.