#include "list_crdt.hpp"
#include <string>
int main() {
ListCRDT<std::string> replicaA(1); ListCRDT<std::string> replicaB(2);
replicaA.insert(0, "Hello");
replicaA.insert(1, "World");
replicaB.insert(0, "Goodbye");
replicaB.insert(1, "Cruel");
std::cout << "Replica A (Visible): ";
replicaA.print_visible();
std::cout << "Replica B (Visible): ";
replicaB.print_visible();
replicaA.merge(replicaB);
replicaB.merge(replicaA);
std::cout << "\nAfter merging:" << std::endl;
std::cout << "Replica A (Visible): ";
replicaA.print_visible();
std::cout << "Replica B (Visible): ";
replicaB.print_visible();
replicaA.insert(2, "!");
replicaB.insert(2, "?");
replicaA.merge(replicaB);
replicaB.merge(replicaA);
std::cout << "\nAfter concurrent insertions and merging:" << std::endl;
std::cout << "Replica A (Visible): ";
replicaA.print_visible();
std::cout << "Replica B (Visible): ";
replicaB.print_visible();
replicaA.delete_element(1); replicaB.delete_element(0);
replicaA.merge(replicaB);
replicaB.merge(replicaA);
std::cout << "\nAfter deletions and merging:" << std::endl;
std::cout << "Replica A (Visible): ";
replicaA.print_visible();
std::cout << "Replica B (Visible): ";
replicaB.print_visible();
replicaA.garbage_collect();
replicaB.garbage_collect();
std::cout << "\nAfter garbage collection:" << std::endl;
std::cout << "Replica A (All Elements):" << std::endl;
replicaA.print_all_elements();
std::cout << "Replica B (All Elements):" << std::endl;
replicaB.print_all_elements();
replicaA.insert(2, "New Line");
auto delta = replicaA.generate_delta(replicaB);
replicaB.apply_delta(delta.first, delta.second);
std::cout << "\nAfter delta synchronization:" << std::endl;
std::cout << "Replica A (Visible): ";
replicaA.print_visible();
std::cout << "Replica B (Visible): ";
replicaB.print_visible();
return 0;
}