string/
string.rs

1use std::io::{self, stdin, stdout, Write};
2
3use std::collections::HashSet;
4use interns::Interner;
5
6pub fn main() -> io::Result<()> {
7    let mut interner: Interner<str> = Interner::new();
8
9    let mut words = HashSet::new();
10    let mut line = String::new();
11    loop {
12        line.clear();
13        print!("> ");
14        stdout().flush()?;
15
16        stdin().read_line(&mut line)?;
17        let linet = line.trim();
18        if linet.is_empty() { break }
19        let sym = interner.get_or_intern(linet);
20        if words.contains(&sym) {
21            println!("String '{linet}' already interned as {sym:?}");
22        } else {
23            words.insert(sym);
24            println!("'{linet}' = {sym:?}");
25        }
26    }
27
28    println!("\n== Interned symbols ==");
29    let mut syms = words.iter().collect::<Vec<_>>();
30    syms.sort();
31    for sym in syms {
32        let s = interner.resolve(*sym).unwrap();
33        println!("{sym:?} = '{s}'");
34    }
35
36    Ok(())
37}