use deepmerge::prelude::*;
#[cfg(feature = "std")]
use deepmerge::{vec_append_with_dedupe, vec_prepend_with_dedupe};
fn main() {
println!("=== Sequence Deduplication Examples ===\n");
basic_dedupe_example();
#[cfg(feature = "std")]
explicit_dedupe_functions();
custom_key_extraction_example();
}
fn basic_dedupe_example() {
println!("## Basic Deduplication\n");
let policy = ComposedPolicy::new(DefaultPolicy)
.with_sequence_dedupe(true);
let mut tags = vec!["rust", "web", "rust", "api"];
let new_tags = vec!["api", "server", "web"];
println!("Before merge:");
println!(" tags: {:?}", tags);
println!(" new_tags: {:?}", new_tags);
tags.merge_with_policy(new_tags, &policy);
println!("After merge (no automatic dedup without bounds):");
println!(" tags: {:?}", tags);
println!(" Note: Duplicates remain because Vec<&str> can't auto-dedupe\n");
}
#[cfg(feature = "std")]
fn explicit_dedupe_functions() {
println!("## Explicit Deduplication Functions\n");
let mut tags = vec!["rust", "web", "rust", "api"];
let new_tags = vec!["api", "server", "web"];
println!("Using vec_append_with_dedupe:");
println!(" Before: {:?}", tags);
vec_append_with_dedupe(&mut tags, new_tags.clone());
println!(" After: {:?}", tags);
let mut tags = vec!["rust", "web", "rust"];
println!("\nUsing vec_prepend_with_dedupe:");
println!(" Before: {:?}", tags);
vec_prepend_with_dedupe(&mut tags, new_tags);
println!(" After: {:?}", tags);
println!();
}
fn custom_key_extraction_example() {
println!("## Custom Key Extraction (Manual Approach)\n");
#[derive(Debug, Clone, PartialEq)]
struct User {
id: u32,
name: String,
score: i32,
}
let mut users = vec![
User { id: 1, name: "Alice".to_string(), score: 100 },
User { id: 2, name: "Bob".to_string(), score: 85 },
User { id: 1, name: "Alice Updated".to_string(), score: 110 }, ];
let new_users = vec![
User { id: 3, name: "Charlie".to_string(), score: 95 },
User { id: 2, name: "Bob Updated".to_string(), score: 90 }, ];
println!("Original users: {:#?}", users);
println!("New users: {:#?}", new_users);
#[cfg(feature = "std")]
{
use std::collections::HashSet;
let mut seen_ids = HashSet::new();
let mut result = Vec::new();
for user in users.into_iter().chain(new_users.into_iter()) {
if seen_ids.insert(user.id) {
result.push(user);
}
}
users = result;
println!("\nAfter manual dedup by ID: {:#?}", users);
}
#[cfg(not(feature = "std"))]
{
users.extend(new_users);
println!("\nAfter merge (no dedup without std): {:#?}", users);
}
println!("\n=== Notes ===");
println!("- sequence_dedupe policy flag is parsed but requires explicit bounds");
println!("- unique_by is parsed in derive macro but not yet wired to runtime");
println!("- Use explicit helper functions for types with Eq + Hash");
println!("- For custom key extraction, implement manual deduplication");
}