pub fn perform_replacement(
search_results: Vec<SearchResultWithReplacement>,
background_processing_sender: UnboundedSender<BackgroundProcessingEvent>,
cancelled: Arc<AtomicBool>,
replacements_completed: Arc<AtomicUsize>,
event_sender: UnboundedSender<Event>,
validation_search_config: Option<FileSearcher>,
file_content_provider: Arc<dyn FileContentProvider>,
) -> JoinHandle<()>