use std::collections::HashMap; struct Context { variables: Vec, var_lookup: HashMap, } #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] struct Var { idx: usize, } impl Context { fn var(&mut self, name: &str) -> Var { if let Some(v) = self.var_lookup.get(name) { return *v; } let idx = self.variables.len(); let var = Var { idx }; self.variables.push(name.to_string()); self.var_lookup.insert(name.to_string(), var); var } } impl Var { fn show<'r>(&self, ctx: &'r Context) -> &'r str { &ctx.variables[self.idx] } } struct StoryState { variables: HashMap>, } struct Story { state: StoryState, storylets: Vec, } struct Storylet { } #[cfg(test)] mod tests { #[test] fn it_works() { assert_eq!(2 + 2, 4); } }