diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-04-04 14:30:28 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-04-04 14:30:28 +0200 |
commit | 14756511ed322cf8544acd612c741920224449c9 (patch) | |
tree | 614fefd77a89648978b4f3eefc718df7256909bb | |
parent | 0dce0832b9f389f9a3d2bf815963fd72e41659d1 (diff) |
Make merging handler into own trait
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/async_dag.rs | 32 |
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(); |