#map #lazy-evaluation #once #cache

no-std once_map

Single assignment and lazy maps

24 releases

0.4.21 Oct 14, 2024
0.4.19 Aug 28, 2024
0.4.18 May 15, 2024
0.4.15 Feb 13, 2024
0.3.1 Jul 10, 2022

#26 in Caching

Download history 10520/week @ 2024-09-21 11228/week @ 2024-09-28 11898/week @ 2024-10-05 11596/week @ 2024-10-12 10965/week @ 2024-10-19 10729/week @ 2024-10-26 9608/week @ 2024-11-02 6328/week @ 2024-11-09 2558/week @ 2024-11-16 2408/week @ 2024-11-23 3143/week @ 2024-11-30 2653/week @ 2024-12-07 2584/week @ 2024-12-14 1214/week @ 2024-12-21 1376/week @ 2024-12-28 2315/week @ 2025-01-04

7,783 downloads per month
Used in 17 crates (6 directly)

MIT/Apache

65KB
2K SLoC

once_map

Crates.io Docs.rs Minimum rustc version

This crate provides OnceMap, a type of HashMap where entries can be written with a shared reference, but can be written ony once. This is similar to once_cell, but with a map. This enables to reference values inside the map for the lifetime of the map, without the need of further locks.

This makes this type perfect for implementation of caches. A type LazyMap is provided for such cases.

This crate provides such a map heavily optimized for concurrent use, but also a single-threaded version.

Example

let map = OnceMap::new();

// All these are `&str` pointing directly in the map.
// Note that we don't need a mutable reference, so we can have several of
// them at the same time.
let roses = map.insert(String::from("rose"), |_| String::from("red"));
let violets = map.insert(String::from("violets"), |_| String::from("blue"));
let sugar = map.insert(String::from("sugar"), |_| String::from("sweet"));

assert_eq!(roses, "red");
assert_eq!(violets, "blue");
assert_eq!(sugar, "sweet");

// The closure is never run here, because we already have a value for "rose"
let roses = map.insert(String::from("rose"), |_| String::from("green"));
// The old value did not change
assert_eq!(roses, "red");

Dependencies

~1.2–6.5MB
~33K SLoC