Skip to content

Commit

Permalink
feat: port.as_directed to match on either direction
Browse files Browse the repository at this point in the history
  • Loading branch information
aborgna-q committed Nov 7, 2023
1 parent b7ebb0d commit 356bbc5
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 18 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ petgraph = { version = "0.6.3", default-features = false }
context-iterators = "0.2.0"
serde_json = "1.0.97"
delegate = "0.10.0"
either = "1.9.0"

[features]
pyo3 = ["dep:pyo3"]
Expand Down
34 changes: 16 additions & 18 deletions src/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use derive_more::From;

use either::Either::{self, Left, Right};
#[cfg(feature = "pyo3")]
use pyo3::pyclass;

Expand Down Expand Up @@ -92,35 +93,32 @@ impl Port {
/// [HugrError::InvalidPortDirection]
#[inline]
pub fn as_incoming(&self) -> Result<IncomingPort, HugrError> {
match self.direction() {
Direction::Incoming => Ok(IncomingPort {
index: self.index() as u16,
}),
dir @ Direction::Outgoing => Err(HugrError::InvalidPortDirection(dir)),
}
self.as_directed()
.left()
.ok_or(HugrError::InvalidPortDirection(self.direction()))
}

/// Converts to an [OutgoingPort] if this port is one; else fails with
/// [HugrError::InvalidPortDirection]
#[inline]
pub fn as_outgoing(&self) -> Result<OutgoingPort, HugrError> {
self.as_directed()
.right()
.ok_or(HugrError::InvalidPortDirection(self.direction()))
}

/// Converts to either an [IncomingPort] or an [OutgoingPort], as appropriate.
#[inline]
pub fn as_directed(&self) -> Either<IncomingPort, OutgoingPort> {
match self.direction() {
Direction::Outgoing => Ok(OutgoingPort {
Direction::Incoming => Left(IncomingPort {
index: self.index() as u16,
}),
Direction::Outgoing => Right(OutgoingPort {
index: self.index() as u16,
}),
dir @ Direction::Incoming => Err(HugrError::InvalidPortDirection(dir)),
}
}
/// Creates a new outgoing port.
#[inline]
pub fn try_new_outgoing(port: impl TryInto<OutgoingPort>) -> Result<Self, HugrError> {
let Ok(port) = port.try_into() else {
return Err(HugrError::InvalidPortDirection(Direction::Incoming));
};
Ok(Self {
offset: portgraph::PortOffset::new_outgoing(port.index()),
})
}

/// Returns the direction of the port.
#[inline]
Expand Down

0 comments on commit 356bbc5

Please sign in to comment.