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}