use fastskip::ConcurrentSkipList;
fn main() {
let sl = ConcurrentSkipList::new();
sl.insert(b"user:1001", b"alice");
sl.insert(b"user:1002", b"bob");
sl.insert(b"user:1003", b"charlie");
sl.insert(b"user:1004", b"diana");
sl.insert(b"user:1005", b"eve");
assert!(!sl.insert(b"user:1001", b"ALICE"));
let (val, tombstone) = sl.get(b"user:1002").unwrap();
assert_eq!(val, b"bob");
assert!(!tombstone);
assert_eq!(sl.get_live(b"user:1002"), Some(b"bob".as_slice()));
assert_eq!(sl.get_live(b"user:9999"), None);
assert!(sl.delete(b"user:1002")); assert!(!sl.delete(b"user:1002"));
let (_, tomb) = sl.get(b"user:1002").unwrap();
assert!(tomb);
assert_eq!(sl.get_live(b"user:1002"), None);
println!("All entries (including tombstones):");
for entry in sl.iter() {
let status = if entry.is_tombstone {
" [TOMBSTONE]"
} else {
""
};
println!(
" {} -> {}{}",
std::str::from_utf8(entry.key).unwrap(),
std::str::from_utf8(entry.value).unwrap(),
status,
);
}
println!("\nCursor scan from user:1003:");
if let Some(cursor) = sl.cursor_at(b"user:1003") {
for entry in cursor {
if !entry.is_tombstone {
println!(
" {} -> {}",
std::str::from_utf8(entry.key).unwrap(),
std::str::from_utf8(entry.value).unwrap(),
);
}
}
}
let snap = sl.snapshot();
println!(
"\nSnapshot sees {} entries (including tombstones)",
snap.iter().count()
);
let (frozen, fresh) = sl.seal().unwrap();
println!(
"\nFrozen memtable: len={}, memory={} bytes",
frozen.len(),
frozen.memory_usage()
);
println!(
"Fresh memtable: len={}, memory={} bytes",
fresh.len(),
fresh.memory_usage()
);
fresh.insert(b"user:2001", b"frank");
println!("After insert: fresh len={}", fresh.len());
std::mem::drop(frozen);
println!("\nFrozen dropped. Fresh is ready for production use.");
}