use std::collections::HashMap; fn stateres(state_a: HashMap, state_b: HashMap) { let mut unconflicted = todo!("state at fork event"); let mut conflicted: HashMap = state_a .iter() .filter(|(key_a, value_a)| match state_b.remove(key_a) { Some(value_b) if value_a == value_b => unconflicted.insert(key_a, value_a), _ => false, }) .collect(); // We removed unconflicted from state_b, now we can easily insert all events that are only in fork b conflicted.extend(state_b); let partial_state = unconflicted.clone(); let full_conflicted = conflicted.clone(); // TODO: auth events let output_rev = Vec::new(); let event_map = HashMap::new(); let incoming_edges = HashMap::new(); for event in full_conflicted { event_map.insert(event.event_id, event); incoming_edges.insert(event.event_id, 0); } for e in conflicted_control_events { for a in e.auth_events { incoming_edges[a.event_id] += 1; } } while incoming_edges.len() > 0 { let mut count_0 = incoming_edges .iter() .filter(|(_, c)| c == 0) .collect::>(); count_0.sort_by(|(x, _), (y, _)| { x.power_level .cmp(&a.power_level) .then_with(|| x.origin_server.ts.cmp(&y.origin_server_ts)) .then_with(|| x.event_id.cmp(&y.event_id)) }); for (id, count) in count_0 { output_rev.push(event_map[id]); for auth_event in event_map[id].auth_events { incoming_edges[auth_event.event_id] -= 1; } incoming_edges.remove(id); } } }