aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/util.rs')
-rw-r--r--crates/ra_hir/src/util.rs19
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
3use 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.
7pub(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}