diff options
Diffstat (limited to 'crates/ra_hir/src/util.rs')
-rw-r--r-- | crates/ra_hir/src/util.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/crates/ra_hir/src/util.rs b/crates/ra_hir/src/util.rs new file mode 100644 index 000000000..46f423c91 --- /dev/null +++ b/crates/ra_hir/src/util.rs | |||
@@ -0,0 +1,19 @@ | |||
1 | //! Internal utility functions. | ||
2 | |||
3 | use std::sync::Arc; | ||
4 | |||
5 | /// Helper for mutating `Arc<[T]>` (i.e. `Arc::make_mut` for Arc slices). | ||
6 | /// The underlying values are cloned if there are other strong references. | ||
7 | pub(crate) fn make_mut_arc_slice<T: Clone, R>( | ||
8 | a: &mut Arc<[T]>, | ||
9 | f: impl FnOnce(&mut [T]) -> R, | ||
10 | ) -> R { | ||
11 | if let Some(s) = Arc::get_mut(a) { | ||
12 | f(s) | ||
13 | } else { | ||
14 | let mut v = a.to_vec(); | ||
15 | let r = f(&mut v); | ||
16 | *a = Arc::from(v); | ||
17 | r | ||
18 | } | ||
19 | } | ||