diff --git a/CHANGELOG.md b/CHANGELOG.md index fcc6c72..5532ccc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Thunderdome Changelog ## Unreleased Changes +* Added `Arena::map` for converting an arena to another, with different value type, preserving indexing. ## 0.3.0 (2020-10-16) * Added `Arena::invalidate` for invalidating indices on-demand, as a faster remove-followed-by-reinsert. diff --git a/src/arena.rs b/src/arena.rs index 7125266..efcf51c 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -288,6 +288,29 @@ impl Arena { slot: 0, } } + + /// Returns an arena with identical indexing and function `f` applied to each value. + pub fn map(mut self, mut f: F) -> Arena + where + F: FnMut(T) -> U, + { + use Entry::*; + Arena { + storage: self + .storage + .drain(..) + .map(|entry| match entry { + Occupied(OccupiedEntry { generation, value }) => Occupied(OccupiedEntry { + generation, + value: f(value), + }), + Empty(empty) => Empty(empty), + }) + .collect(), + len: self.len, + first_free: self.first_free, + } + } } /// Methods exposed only within the crate.