diff options
author | JSDurand <mmemmew@gmail.com> | 2022-12-23 00:36:31 +0800 |
---|---|---|
committer | JSDurand <mmemmew@gmail.com> | 2022-12-23 00:36:31 +0800 |
commit | 8463dd24f815fe2b8f25fe9763e0a43023bfbb20 (patch) | |
tree | 343eea3c634efbbf72c64ed5dd778ecce60c3eea /graph/src/builder.rs | |
parent | 9f1c88b863e247da3cd60d2792a7a13b18e25e53 (diff) |
renaming core to chain and some other changes
Some changes:
- The core crate is renamed to "chain".
- The crate "viz" is added, which will provide layered graph drawing
algorithms.
- A function is added to convert from a grammar to the regular
language of its left-linear closures.
- A function is added to convert from a nondeterministic finite
automaton to its "null" closure. A null closure is the same
automaton with edges added, as if some edges are "null". Whether an
edge is null is determined by a function.
Combined with the previous change, we can convert a grammar to the
regular language of the null closure of its left-linear closures.
---
Now it remains to test more grammars and add an Atom trait, before
finishing the part about compilations.
Diffstat (limited to 'graph/src/builder.rs')
-rw-r--r-- | graph/src/builder.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/graph/src/builder.rs b/graph/src/builder.rs new file mode 100644 index 0000000..ce85cce --- /dev/null +++ b/graph/src/builder.rs @@ -0,0 +1,53 @@ +//! This file defines the expected behaviours of a builder of graphs. + +use crate::{error::Error, Graph}; + +/// A builder is actually just a graph that can be altered in more +/// ways than an extension graph can. It should not have any methods +/// from the Graph trait, though, as we shall convert a builder to a +/// normal final graph before using it. +pub trait Builder: Default { + /// Some graphs are labelled. This type should be the type of the + /// labels. + type Label; + + /// The type of the result graph. + type Result: Graph; + + /// Construct an empty builder with the capacity to hold a given + /// number of nodes. + /// + /// Implementations may ignore this method, where the default + /// implementation just calls `Default::default`. + #[inline] + fn with_capacity(_size: usize) -> Self { + Self::default() + } + + /// Add a vertex without children. + fn add_vertex(&mut self) -> usize; + + /// Add an edge from the source to the target. + fn add_edge(&mut self, source: usize, target: usize, label: Self::Label) -> Result<(), Error>; + + /// Remove an edge from the source to the target. + /// + /// Since some graphs are labelled, the users are allowed to pass + /// a predicate to determine if an edge from the source to the + /// target should be removed. + fn remove_edge<F>(&mut self, source: usize, target: usize, predicate: F) -> Result<(), Error> + where + F: Fn(Self::Label) -> bool; + + /// Convert the builder into a graph. + /// + /// This is the purpose of having a builder. + fn build(self) -> Self::Result; + + /// Convert the builder into a graph using a reference. + /// + /// This is similar to [`build`][Builder::build], but takes an + /// immutable reference of the builder, so that the builder can + /// still be used later on. + fn build_ref(&self) -> Self::Result; +} |