chore(sdk): Rename Update::PushItems::position_hint to …::at.

This commit is contained in:
Ivan Enderlin
2024-05-23 13:40:08 +02:00
parent ba1c797db4
commit 39a6a2eb8c
3 changed files with 71 additions and 122 deletions

View File

@@ -145,11 +145,11 @@ impl UpdateToVectorDiff {
/// `VectorDiff::Insert` need an index. To compute this index, the algorithm
/// will iterate over all pairs to accumulate each chunk length until it
/// finds the appropriate pair (given by
/// [`Update::PushItems::position_hint`]). This is _the offset_. To this
/// offset, the algorithm adds the position's index of the new items
/// (still given by [`Update::PushItems::position_hint`]). This is
/// _the index_. This logic works for all cases as long as pairs are
/// maintained according to the rules hereinabove.
/// [`Update::PushItems::at`]). This is _the offset_. To this offset, the
/// algorithm adds the position's index of the new items (still given by
/// [`Update::PushItems::at`]). This is _the index_. This logic works
/// for all cases as long as pairs are maintained according to the rules
/// hereinabove.
///
/// That's a pretty memory compact and computation efficient way to map a
/// `Vec<Update<Item, Gap>>` into a `Vec<VectorDiff<Item>>`. The larger the
@@ -201,7 +201,7 @@ impl UpdateToVectorDiff {
//
// ```
// Update::PushItems {
// position_hint: Position(ChunkIdentifier(0), 1),
// at: Position(ChunkIdentifier(0), 1),
// items: vec!['w', 'x'],
// }
// Update::NewItemsChunk {
@@ -210,7 +210,7 @@ impl UpdateToVectorDiff {
// next: Some(ChunkIdentifier(1)),
// }
// Update::PushItems {
// position_hint: Position(ChunkIdentifier(2), 0),
// at: Position(ChunkIdentifier(2), 0),
// items: vec!['y', 'z'],
// }
// ```
@@ -220,7 +220,7 @@ impl UpdateToVectorDiff {
// ```
// Update::StartReattachItems
// Update::PushItems {
// position_hint: Position(ChunkIdentifier(2), 2),
// at: Position(ChunkIdentifier(2), 2),
// items: vec!['b']
// }
// Update::NewItemsChunk {
@@ -229,7 +229,7 @@ impl UpdateToVectorDiff {
// next: Some(ChunkIdentifier(1)),
// }
// Update::PushItems {
// position_hint: Position(ChunkIdentifier(3), 0),
// at: Position(ChunkIdentifier(3), 0),
// items: vec!['c'],
// }
// Update::EndReattachItems
@@ -320,7 +320,7 @@ impl UpdateToVectorDiff {
let _ = self.chunks.remove(chunk_index);
}
Update::PushItems { position_hint: position, items } => {
Update::PushItems { at: position, items } => {
let expected_chunk_identifier = position.chunk_identifier();
let (chunk_index, offset, chunk_length) = {

View File

@@ -1089,7 +1089,7 @@ impl<const CAPACITY: usize, Item, Gap> Chunk<CAPACITY, Item, Gap> {
if let Some(updates) = updates.as_mut() {
updates.push(Update::PushItems {
position_hint: Position(identifier, start),
at: Position(identifier, start),
items: items[start..].to_vec(),
});
}
@@ -1104,7 +1104,7 @@ impl<const CAPACITY: usize, Item, Gap> Chunk<CAPACITY, Item, Gap> {
if let Some(updates) = updates.as_mut() {
updates.push(Update::PushItems {
position_hint: Position(identifier, start),
at: Position(identifier, start),
items: items[start..].to_vec(),
});
}
@@ -1299,14 +1299,14 @@ mod tests {
assert_items_eq!(linked_chunk, ['a']);
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
&[PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
);
linked_chunk.push_items_back(['b', 'c']);
assert_items_eq!(linked_chunk, ['a', 'b', 'c']);
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[PushItems { position_hint: Position(ChunkIdentifier(0), 1), items: vec!['b', 'c'] }]
&[PushItems { at: Position(ChunkIdentifier(0), 1), items: vec!['b', 'c'] }]
);
linked_chunk.push_items_back(['d', 'e']);
@@ -1319,7 +1319,7 @@ mod tests {
new: ChunkIdentifier(1),
next: None
},
PushItems { position_hint: Position(ChunkIdentifier(1), 0), items: vec!['d', 'e'] }
PushItems { at: Position(ChunkIdentifier(1), 0), items: vec!['d', 'e'] }
]
);
@@ -1328,22 +1328,19 @@ mod tests {
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[
PushItems { position_hint: Position(ChunkIdentifier(1), 2), items: vec!['f'] },
PushItems { at: Position(ChunkIdentifier(1), 2), items: vec!['f'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(1)),
new: ChunkIdentifier(2),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(2), 0),
items: vec!['g', 'h', 'i']
},
PushItems { at: Position(ChunkIdentifier(2), 0), items: vec!['g', 'h', 'i'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(2)),
new: ChunkIdentifier(3),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(3), 0), items: vec!['j'] },
PushItems { at: Position(ChunkIdentifier(3), 0), items: vec!['j'] },
]
);
@@ -1359,7 +1356,7 @@ mod tests {
assert_items_eq!(linked_chunk, ['a']);
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
&[PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
);
linked_chunk.push_gap_back(());
@@ -1384,16 +1381,13 @@ mod tests {
new: ChunkIdentifier(2),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(2), 0),
items: vec!['b', 'c', 'd']
},
PushItems { at: Position(ChunkIdentifier(2), 0), items: vec!['b', 'c', 'd'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(2)),
new: ChunkIdentifier(3),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(3), 0), items: vec!['e'] },
PushItems { at: Position(ChunkIdentifier(3), 0), items: vec!['e'] },
]
);
@@ -1428,16 +1422,13 @@ mod tests {
new: ChunkIdentifier(6),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(6), 0),
items: vec!['f', 'g', 'h']
},
PushItems { at: Position(ChunkIdentifier(6), 0), items: vec!['f', 'g', 'h'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(6)),
new: ChunkIdentifier(7),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(7), 0), items: vec!['i'] },
PushItems { at: Position(ChunkIdentifier(7), 0), items: vec!['i'] },
]
);
@@ -1667,19 +1658,13 @@ mod tests {
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[
PushItems {
position_hint: Position(ChunkIdentifier(0), 0),
items: vec!['a', 'b', 'c']
},
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a', 'b', 'c'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(0)),
new: ChunkIdentifier(1),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(1), 0),
items: vec!['d', 'e', 'f']
},
PushItems { at: Position(ChunkIdentifier(1), 0), items: vec!['d', 'e', 'f'] },
]
);
@@ -1700,27 +1685,21 @@ mod tests {
linked_chunk.updates().unwrap().take(),
&[
DetachLastItems { at: Position(ChunkIdentifier(1), 1) },
PushItems {
position_hint: Position(ChunkIdentifier(1), 1),
items: vec!['w', 'x']
},
PushItems { at: Position(ChunkIdentifier(1), 1), items: vec!['w', 'x'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(1)),
new: ChunkIdentifier(2),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(2), 0),
items: vec!['y', 'z']
},
PushItems { at: Position(ChunkIdentifier(2), 0), items: vec!['y', 'z'] },
StartReattachItems,
PushItems { position_hint: Position(ChunkIdentifier(2), 2), items: vec!['e'] },
PushItems { at: Position(ChunkIdentifier(2), 2), items: vec!['e'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(2)),
new: ChunkIdentifier(3),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(3), 0), items: vec!['f'] },
PushItems { at: Position(ChunkIdentifier(3), 0), items: vec!['f'] },
EndReattachItems,
]
);
@@ -1740,27 +1719,21 @@ mod tests {
linked_chunk.updates().unwrap().take(),
&[
DetachLastItems { at: Position(ChunkIdentifier(0), 0) },
PushItems {
position_hint: Position(ChunkIdentifier(0), 0),
items: vec!['l', 'm', 'n']
},
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['l', 'm', 'n'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(0)),
new: ChunkIdentifier(4),
next: Some(ChunkIdentifier(1)),
},
PushItems { position_hint: Position(ChunkIdentifier(4), 0), items: vec!['o'] },
PushItems { at: Position(ChunkIdentifier(4), 0), items: vec!['o'] },
StartReattachItems,
PushItems {
position_hint: Position(ChunkIdentifier(4), 1),
items: vec!['a', 'b']
},
PushItems { at: Position(ChunkIdentifier(4), 1), items: vec!['a', 'b'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(4)),
new: ChunkIdentifier(5),
next: Some(ChunkIdentifier(1)),
},
PushItems { position_hint: Position(ChunkIdentifier(5), 0), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(5), 0), items: vec!['c'] },
EndReattachItems,
]
);
@@ -1780,12 +1753,9 @@ mod tests {
linked_chunk.updates().unwrap().take(),
&[
DetachLastItems { at: Position(ChunkIdentifier(5), 0) },
PushItems {
position_hint: Position(ChunkIdentifier(5), 0),
items: vec!['r', 's']
},
PushItems { at: Position(ChunkIdentifier(5), 0), items: vec!['r', 's'] },
StartReattachItems,
PushItems { position_hint: Position(ChunkIdentifier(5), 2), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(5), 2), items: vec!['c'] },
EndReattachItems,
]
);
@@ -1804,10 +1774,7 @@ mod tests {
);
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[PushItems {
position_hint: Position(ChunkIdentifier(3), 1),
items: vec!['p', 'q']
}]
&[PushItems { at: Position(ChunkIdentifier(3), 1), items: vec!['p', 'q'] }]
);
assert_eq!(linked_chunk.len(), 18);
}
@@ -1869,19 +1836,13 @@ mod tests {
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[
PushItems {
position_hint: Position(ChunkIdentifier(0), 0),
items: vec!['a', 'b', 'c']
},
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a', 'b', 'c'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(0)),
new: ChunkIdentifier(1),
next: None
},
PushItems {
position_hint: Position(ChunkIdentifier(1), 0),
items: vec!['d', 'e', 'f']
},
PushItems { at: Position(ChunkIdentifier(1), 0), items: vec!['d', 'e', 'f'] },
]
);
@@ -1907,10 +1868,7 @@ mod tests {
new: ChunkIdentifier(3),
next: Some(ChunkIdentifier(1)),
},
PushItems {
position_hint: Position(ChunkIdentifier(3), 0),
items: vec!['b', 'c']
},
PushItems { at: Position(ChunkIdentifier(3), 0), items: vec!['b', 'c'] },
EndReattachItems,
]
);
@@ -1939,7 +1897,7 @@ mod tests {
new: ChunkIdentifier(5),
next: Some(ChunkIdentifier(2)),
},
PushItems { position_hint: Position(ChunkIdentifier(5), 0), items: vec!['a'] },
PushItems { at: Position(ChunkIdentifier(5), 0), items: vec!['a'] },
EndReattachItems,
]
);
@@ -2055,7 +2013,7 @@ mod tests {
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a', 'b'] },
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a', 'b'] },
NewGapChunk {
previous: Some(ChunkIdentifier(0)),
new: ChunkIdentifier(1),
@@ -2067,7 +2025,7 @@ mod tests {
new: ChunkIdentifier(2),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(2), 0), items: vec!['l', 'm'] }
PushItems { at: Position(ChunkIdentifier(2), 0), items: vec!['l', 'm'] }
]
);
@@ -2091,19 +2049,13 @@ mod tests {
new: ChunkIdentifier(3),
next: Some(ChunkIdentifier(2)),
},
PushItems {
position_hint: Position(ChunkIdentifier(3), 0),
items: vec!['d', 'e', 'f']
},
PushItems { at: Position(ChunkIdentifier(3), 0), items: vec!['d', 'e', 'f'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(3)),
new: ChunkIdentifier(4),
next: Some(ChunkIdentifier(2)),
},
PushItems {
position_hint: Position(ChunkIdentifier(4), 0),
items: vec!['g', 'h']
},
PushItems { at: Position(ChunkIdentifier(4), 0), items: vec!['g', 'h'] },
RemoveChunk(ChunkIdentifier(1)),
]
);
@@ -2143,16 +2095,13 @@ mod tests {
new: ChunkIdentifier(6),
next: None,
},
PushItems {
position_hint: Position(ChunkIdentifier(6), 0),
items: vec!['w', 'x', 'y']
},
PushItems { at: Position(ChunkIdentifier(6), 0), items: vec!['w', 'x', 'y'] },
NewItemsChunk {
previous: Some(ChunkIdentifier(6)),
new: ChunkIdentifier(7),
next: None,
},
PushItems { position_hint: Position(ChunkIdentifier(7), 0), items: vec!['z'] },
PushItems { at: Position(ChunkIdentifier(7), 0), items: vec!['z'] },
RemoveChunk(ChunkIdentifier(5)),
]
);

View File

@@ -70,7 +70,7 @@ pub enum Update<Item, Gap> {
/// incrementally computed from the previous items, which requires the
/// reading of the last previous item. With `at`, the update readers no
/// longer need to do so.
position_hint: Position,
at: Position,
/// The items.
items: Vec<Item>,
@@ -384,9 +384,9 @@ mod tests {
assert_eq!(
updates.take(),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { at: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { at: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
]
);
@@ -426,12 +426,12 @@ mod tests {
assert_eq!(
updates.inner.write().unwrap().take_with_token(other_token),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 3), items: vec!['d'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 4), items: vec!['e'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 5), items: vec!['f'] },
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { at: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { at: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(0), 3), items: vec!['d'] },
PushItems { at: Position(ChunkIdentifier(0), 4), items: vec!['e'] },
PushItems { at: Position(ChunkIdentifier(0), 5), items: vec!['f'] },
]
);
@@ -501,20 +501,20 @@ mod tests {
assert_eq!(
updates.take(),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 3), items: vec!['d'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 4), items: vec!['e'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 5), items: vec!['f'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 6), items: vec!['g'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 7), items: vec!['h'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 8), items: vec!['i'] },
PushItems { at: Position(ChunkIdentifier(0), 3), items: vec!['d'] },
PushItems { at: Position(ChunkIdentifier(0), 4), items: vec!['e'] },
PushItems { at: Position(ChunkIdentifier(0), 5), items: vec!['f'] },
PushItems { at: Position(ChunkIdentifier(0), 6), items: vec!['g'] },
PushItems { at: Position(ChunkIdentifier(0), 7), items: vec!['h'] },
PushItems { at: Position(ChunkIdentifier(0), 8), items: vec!['i'] },
]
);
assert_eq!(
updates.inner.write().unwrap().take_with_token(other_token),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 6), items: vec!['g'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 7), items: vec!['h'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 8), items: vec!['i'] },
PushItems { at: Position(ChunkIdentifier(0), 6), items: vec!['g'] },
PushItems { at: Position(ChunkIdentifier(0), 7), items: vec!['h'] },
PushItems { at: Position(ChunkIdentifier(0), 8), items: vec!['i'] },
]
);
@@ -600,7 +600,7 @@ mod tests {
Poll::Ready(Some(items)) => {
assert_eq!(
items,
&[PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
&[PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] }]
);
}
);
@@ -618,9 +618,9 @@ mod tests {
assert_eq!(
linked_chunk.updates().unwrap().take(),
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(0), 0), items: vec!['a'] },
PushItems { at: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { at: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
]
);
assert_matches!(
@@ -629,8 +629,8 @@ mod tests {
assert_eq!(
items,
&[
PushItems { position_hint: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { position_hint: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
PushItems { at: Position(ChunkIdentifier(0), 1), items: vec!['b'] },
PushItems { at: Position(ChunkIdentifier(0), 2), items: vec!['c'] },
]
);
}