#![cfg(feature = "parallel-merge")]
use super::SharedARTrie;
use crate::persistent_artrie::error::Result;
use crate::persistent_artrie_core::shared_access::SharedTrieAccess;
use crate::value::DictionaryValue;
pub trait SharedARTrieParallelExt<V: DictionaryValue> {
fn merge_from_parallel<F>(&self, other: &Self, merge_fn: F) -> Result<usize>
where
F: Fn(&V, &V) -> V + Sync + Send;
}
impl<V: DictionaryValue + Clone + Send + Sync> SharedARTrieParallelExt<V> for SharedARTrie<V> {
fn merge_from_parallel<F>(&self, other: &Self, merge_fn: F) -> Result<usize>
where
F: Fn(&V, &V) -> V + Sync + Send,
{
let merge_lock = self.read().merge_lock.clone();
let _merge_guard = merge_lock.lock();
let entries: Vec<(Vec<u8>, V)> = {
let other_guard = other.read();
match other_guard.iter_prefix_with_values_and_arena(b"") {
Ok(Some(terms)) => terms.into_iter().map(|t| (t.term, t.value)).collect(),
_ => Vec::new(),
}
};
let guard = self.write();
guard.merge_entries_overlay(entries, merge_fn)
}
}