# chain-map
The `ChainMap` type groups a chain of `HashMap`s together in precedence
order and provides a single, unified view into the values. The semantics
for keys are the same as for a `HashMap`, however the value associated
with a given key is the value of that key in the highest-precedence map
that contains the key.
### Rust Version
This version of chain-map requires Rust 1.31 or later.
## Precedence
Maps added to the `ChainMap` earlier have precedence over those added
later. So the first map added to the chain will have the highest
precedence, while the most recent map added will have the lowest.
## Performance
Each read of the `ChainMap` will read the chain of maps in order, so each
operation will complete in worst-case O(N), with `N` the number of maps in
the chain. As a result, this should only be used for cases where the number
of reads is low compared to the number of elements in each map.
## Examples
```rust
use std::collections::HashMap;
use chain_map::ChainMap;
let mut first_map = HashMap::new();
first_map.insert("first", 10);
let mut second_map = HashMap::new();
second_map.insert("first", 20);
second_map.insert("second", 20);
let mut third_map = HashMap::new();
third_map.insert("first", 30);
third_map.insert("second", 30);
third_map.insert("third", 30);
let mut chain: ChainMap<_, _> =
vec![first_map, second_map, third_map].into_iter().collect();
assert_eq!(chain.get("first"), Some(&10));
assert_eq!(chain["second"], 20);
assert!(chain.contains_key("third"));
assert!(!chain.contains_key("fourth"));
```
## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.