diff --git a/Cargo.toml b/Cargo.toml index 1a6df4fd6..1643c110a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] diff --git a/src/core.rs b/src/core.rs index 83bba3ab5..fa9ece839 100644 --- a/src/core.rs +++ b/src/core.rs @@ -4,6 +4,7 @@ use derive_more::From; +use either::Either::{self, Left, Right}; #[cfg(feature = "pyo3")] use pyo3::pyclass; @@ -92,35 +93,32 @@ impl Port { /// [HugrError::InvalidPortDirection] #[inline] pub fn as_incoming(&self) -> Result { - 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 { + 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 { 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) -> Result { - 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]