from __future__ import annotations
import dataclasses
from typing import TYPE_CHECKING, Protocol, TypeAlias
if TYPE_CHECKING:
import flowrep as fr
from pyiron_workflow import datatypes
[docs]
class GraphAction(Protocol):
[docs]
def inverse(self) -> GraphAction: ...
[docs]
@dataclasses.dataclass(frozen=True)
class AddOutput:
port: datatypes.OutputPort
[docs]
def inverse(self) -> RemoveOutput:
return RemoveOutput(self.port)
[docs]
@dataclasses.dataclass(frozen=True)
class RemoveOutput:
port: datatypes.OutputPort
[docs]
def inverse(self) -> AddOutput:
return AddOutput(self.port)
[docs]
@dataclasses.dataclass(frozen=True)
class ReplacePort:
old_port: datatypes.InputPort | datatypes.OutputPort
new_port: datatypes.InputPort | datatypes.OutputPort
[docs]
def inverse(self) -> ReplacePort:
return ReplacePort(self.new_port, self.old_port)
[docs]
@dataclasses.dataclass(frozen=True)
class AddNode:
node: datatypes.Node
[docs]
def inverse(self) -> RemoveNode:
return RemoveNode(self.node)
[docs]
@dataclasses.dataclass(frozen=True)
class RemoveNode:
node: datatypes.Node
[docs]
def inverse(self) -> AddNode:
return AddNode(self.node)
[docs]
@dataclasses.dataclass(frozen=True)
class AddEdge:
edge: datatypes.EdgeTuple
[docs]
def inverse(self) -> RemoveEdge:
return RemoveEdge(self.edge)
[docs]
@dataclasses.dataclass(frozen=True)
class RemoveEdge:
edge: datatypes.EdgeTuple
[docs]
def inverse(self) -> AddEdge:
return AddEdge(self.edge)
[docs]
@dataclasses.dataclass(frozen=True)
class RenameNode:
node: datatypes.Node
old_label: fr.schemas.Label
new_label: fr.schemas.Label
[docs]
def inverse(self) -> RenameNode:
return RenameNode(self.node, self.new_label, self.old_label)
[docs]
@dataclasses.dataclass(frozen=True)
class MoveNode:
node: datatypes.Node
from_graph: datatypes.MutableDag
to_graph: datatypes.MutableDag
old_label: fr.schemas.Label
new_label: fr.schemas.Label
[docs]
def inverse(self) -> MoveNode:
return MoveNode(
node=self.node,
from_graph=self.to_graph,
to_graph=self.from_graph,
old_label=self.new_label,
new_label=self.old_label,
)
GraphDiff: TypeAlias = list[GraphAction]