Conduit is a simple, fast and reliable chat server powered by Matrix https://conduit.rs
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.8 KiB
59 lines
1.8 KiB
use std::collections::HashMap; |
|
|
|
fn stateres(state_a: HashMap<StateTuple, PduEvent>, state_b: HashMap<StateTuple, PduEvent>) { |
|
let mut unconflicted = todo!("state at fork event"); |
|
|
|
let mut conflicted: HashMap<StateTuple, PduEvent> = 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::<Vec<_>>(); |
|
|
|
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); |
|
} |
|
} |
|
}
|
|
|