summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-04-04 14:30:28 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-04-04 14:30:28 +0200
commit14756511ed322cf8544acd612c741920224449c9 (patch)
tree614fefd77a89648978b4f3eefc718df7256909bb /src
parent0dce0832b9f389f9a3d2bf815963fd72e41659d1 (diff)
Make merging handler into own trait
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r--src/async_dag.rs32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/async_dag.rs b/src/async_dag.rs
index 9faf1e6..78886e3 100644
--- a/src/async_dag.rs
+++ b/src/async_dag.rs
@@ -126,16 +126,23 @@ impl<Id, N, Backend> AsyncDag<Id, N, Backend>
///
/// Use the `merger` function to merge the two head IDs and generate a new Node instance for
/// the new HEAD of `self`.
- pub async fn merge<Merger>(&mut self, other: AsyncDag<Id, N, Backend>, merger: Merger) -> Result<Id>
- where Merger: FnOnce(Id, Id) -> Result<N>
+ pub async fn merge<M>(&mut self, other: AsyncDag<Id, N, Backend>, merger: M) -> Result<Id>
+ where M: Merger<Id, N>
{
- let node = merger(self.head.clone(), other.head)?;
+ let node = merger.create_merge_node(self.head.clone(), other.head)?;
let id = self.backend.put(node).await?;
self.head = id.clone();
Ok(id)
}
}
+pub trait Merger<Id, N>
+ where Id: NodeId,
+ N: Node<Id = Id>
+{
+ fn create_merge_node(&self, left_id: Id, right_id: Id) -> Result<N>;
+}
+
pub struct Stream<'a, Id, N, Backend>
where Id: NodeId + Send,
@@ -416,13 +423,18 @@ mod tests {
assert_eq!(branched.head, test::Id(2));
}
- let merge = tokio_test::block_on(dag.merge(branched, |left, right| {
- Ok(test::Node {
- id: test::Id(3),
- parents: vec![left, right],
- data: 45,
- })
- }));
+ struct M;
+ impl super::Merger<test::Id, test::Node> for M {
+ fn create_merge_node(&self, left_id: test::Id, right_id: test::Id) -> Result<test::Node> {
+ Ok(test::Node {
+ id: test::Id(3),
+ parents: vec![left_id, right_id],
+ data: 45,
+ })
+ }
+ }
+
+ let merge = tokio_test::block_on(dag.merge(branched, M));
assert!(merge.is_ok());
let merge = merge.unwrap();