1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
//! This crate contains two data structures for representing variable scopes: //! [`ScopeMap`] and [`ScopeSet`]. They are analogous to `HashMap` and `HashSet`, //! but the main difference is that they store their data in multiple "layers", //! or scopes. //! //! When created, the [`ScopeMap`] and [`ScopeSet`] start with one base layer, which cannot be removed. //! Additional layers can be added with `push_layer()`, and removed with `pop_layer()`. //! Removing a layer removes the entries defined on it. //! //! `ScopeMap` is ideal for representing variable scopes and associated values, //! while `ScopeSet` is more suitable for simply representing the presence of variables and their scopes. //! //! ### Example //! //! ```rust //! use quickscope::*; //! //! let mut vars = ScopeMap::new(); //! //! // Define two variables in main scope //! vars.define("a", 1); //! vars.define("b", 2); //! //! // Add a child scope //! vars.push_layer(); //! //! // Override value of `a` //! vars.define("a", 3); //! //! assert_eq!(Some(&3), vars.get("a")); //! assert_eq!(Some(&2), vars.get("b")); //! //! // Remove child scope //! vars.pop_layer(); //! //! // Value of `a` is no longer overridden //! assert_eq!(Some(&1), vars.get("a")); //! ``` //! //! [`ScopeMap`]: map/struct.ScopeMap.html //! [`ScopeSet`]: set/struct.ScopeSet.html mod map; mod set; pub use map::*; pub use set::*;