diff --git a/src/main/java/dev/compactmods/feather/MemoryGraph.java b/src/main/java/dev/compactmods/feather/MemoryGraph.java index ce35a9b..f278510 100644 --- a/src/main/java/dev/compactmods/feather/MemoryGraph.java +++ b/src/main/java/dev/compactmods/feather/MemoryGraph.java @@ -5,14 +5,16 @@ import dev.compactmods.feather.edge.GraphEdge; import dev.compactmods.feather.edge.GraphEdgeAccessor; import dev.compactmods.feather.edge.GraphEdgeLookupFunction; +import dev.compactmods.feather.edge.InboundGraphEdgeLookupFunction; import dev.compactmods.feather.edge.OutboundGraphEdgeLookupFunction; import dev.compactmods.feather.edge.impl.EmptyEdge; -import dev.compactmods.feather.graph.NodeAccessor; +import dev.compactmods.feather.node.NodeAccessor; import dev.compactmods.feather.node.GraphAdjacentNodeStream; import dev.compactmods.feather.node.Node; import dev.compactmods.feather.node.GraphNodeStream; import dev.compactmods.feather.traversal.GraphNodeStreamFunction; import dev.compactmods.feather.traversal.GraphNodeTransformationFunction; +import dev.compactmods.feather.traversal.GraphTraversalHelper; import java.util.Objects; import java.util.UUID; @@ -105,15 +107,19 @@ public , T, TN extends Node> Stream> } @Override - public , T, TN extends Node> Stream> edges(GraphEdgeLookupFunction func) { - return func.edges(this); + public , T, TN extends Node> Stream> inboundEdges(TN targetNode, Class sourceNodeClass) { + return GraphTraversalHelper.predecessors(this, targetNode, sourceNodeClass) + .map(sn -> graph.edgeValue(sn, targetNode).orElse(null)) + .filter(Objects::nonNull) + .map(e -> { + //noinspection unchecked + return (GraphEdge) e; + }); } @Override public , T, TN extends Node> Stream> outboundEdges(SN sourceNode, Class targetNodeClass) { - return graph.successors(sourceNode) - .stream() - .filter(targetNodeClass::isInstance) + return GraphTraversalHelper.successors(this, sourceNode, targetNodeClass) .map(tn -> graph.edgeValue(sourceNode, tn).orElse(null)) .filter(Objects::nonNull) .map(e -> { @@ -121,9 +127,4 @@ public , T, TN extends Node> Stream> return (GraphEdge) e; }); } - - @Override - public , T, TN extends Node> Stream> outboundEdges(OutboundGraphEdgeLookupFunction func, SN sourceNode) { - return func.getOutboundEdges(this, sourceNode); - } } diff --git a/src/main/java/dev/compactmods/feather/edge/GraphEdgeAccessor.java b/src/main/java/dev/compactmods/feather/edge/GraphEdgeAccessor.java index 7489382..26b5772 100644 --- a/src/main/java/dev/compactmods/feather/edge/GraphEdgeAccessor.java +++ b/src/main/java/dev/compactmods/feather/edge/GraphEdgeAccessor.java @@ -8,9 +8,31 @@ public interface GraphEdgeAccessor { , T, TN extends Node> Stream> edges(Class sourceNodeType, Class targetNodeType); - , T, TN extends Node> Stream> edges(GraphEdgeLookupFunction func); + default , T, TN extends Node> Stream> edges(GraphEdgeLookupFunction func) { + return func.edges(this); + } + + , T, TN extends Node> Stream> inboundEdges(TN targetNode, Class sourceNodeClass); + + default , T, TN extends Node> Stream> inboundEdges(InboundGraphEdgeLookupFunction func, TN targetNode) { + return func.getInboundEdges(this, targetNode); + } + + default , T, TN extends Node, E extends GraphEdge> Stream inboundEdges(TN targetNode, Class sourceNodeClass, Class edgeClass) { + return inboundEdges(targetNode, sourceNodeClass) + .filter(edgeClass::isInstance) + .map(edgeClass::cast); + } , T, TN extends Node> Stream> outboundEdges(SN sourceNode, Class targetNodeClass); - , T, TN extends Node> Stream> outboundEdges(OutboundGraphEdgeLookupFunction func, SN sourceNode); + default , T, TN extends Node> Stream> outboundEdges(OutboundGraphEdgeLookupFunction func, SN sourceNode) { + return func.getOutboundEdges(this, sourceNode); + } + + default , T, TN extends Node, E extends GraphEdge> Stream outboundEdges(SN sourceNode, Class targetNodeClass, Class edgeClass) { + return outboundEdges(sourceNode, targetNodeClass) + .filter(edgeClass::isInstance) + .map(edgeClass::cast); + } } diff --git a/src/main/java/dev/compactmods/feather/edge/InboundGraphEdgeLookupFunction.java b/src/main/java/dev/compactmods/feather/edge/InboundGraphEdgeLookupFunction.java new file mode 100644 index 0000000..5baa662 --- /dev/null +++ b/src/main/java/dev/compactmods/feather/edge/InboundGraphEdgeLookupFunction.java @@ -0,0 +1,11 @@ +package dev.compactmods.feather.edge; + +import dev.compactmods.feather.node.Node; + +import java.util.stream.Stream; + +@FunctionalInterface +public interface InboundGraphEdgeLookupFunction, TN extends Node> { + Stream> getInboundEdges(GraphEdgeAccessor graph, TN originNode); +} + diff --git a/src/main/java/dev/compactmods/feather/node/GraphNodeStream.java b/src/main/java/dev/compactmods/feather/node/GraphNodeStream.java index 9e6c2b7..6ed7039 100644 --- a/src/main/java/dev/compactmods/feather/node/GraphNodeStream.java +++ b/src/main/java/dev/compactmods/feather/node/GraphNodeStream.java @@ -1,7 +1,5 @@ package dev.compactmods.feather.node; -import dev.compactmods.feather.graph.NodeAccessor; - import java.util.stream.Stream; @FunctionalInterface diff --git a/src/main/java/dev/compactmods/feather/graph/NodeAccessor.java b/src/main/java/dev/compactmods/feather/node/NodeAccessor.java similarity index 89% rename from src/main/java/dev/compactmods/feather/graph/NodeAccessor.java rename to src/main/java/dev/compactmods/feather/node/NodeAccessor.java index f9ea4f4..5c62c63 100644 --- a/src/main/java/dev/compactmods/feather/graph/NodeAccessor.java +++ b/src/main/java/dev/compactmods/feather/node/NodeAccessor.java @@ -1,4 +1,4 @@ -package dev.compactmods.feather.graph; +package dev.compactmods.feather.node; import dev.compactmods.feather.node.Node; @@ -13,4 +13,5 @@ public interface NodeAccessor { > Stream> predecessors(T sourceNode); > Stream> successors(T sourceNode); + } diff --git a/src/main/java/dev/compactmods/feather/traversal/GraphTraversalHelper.java b/src/main/java/dev/compactmods/feather/traversal/GraphTraversalHelper.java index 0345137..da13560 100644 --- a/src/main/java/dev/compactmods/feather/traversal/GraphTraversalHelper.java +++ b/src/main/java/dev/compactmods/feather/traversal/GraphTraversalHelper.java @@ -1,7 +1,7 @@ package dev.compactmods.feather.traversal; import dev.compactmods.feather.edge.GraphEdge; -import dev.compactmods.feather.graph.NodeAccessor; +import dev.compactmods.feather.node.NodeAccessor; import dev.compactmods.feather.node.Node; import java.util.stream.Stream; @@ -15,10 +15,10 @@ public static , TD, T extends Node, Edge extends Grap .map(type::cast); } - public static , TD, T extends Node, Edge extends GraphEdge> Stream predecessors(NodeAccessor graph, S sourceNode, Class targetNodeClass) { - return graph.predecessors(sourceNode) - .filter(targetNodeClass::isInstance) - .map(targetNodeClass::cast); + public static , TD, T extends Node, Edge extends GraphEdge> Stream predecessors(NodeAccessor graph, T targetNode, Class sourceNodeClass) { + return graph.predecessors(targetNode) + .filter(sourceNodeClass::isInstance) + .map(sourceNodeClass::cast); } public static , TD, T extends Node, Edge extends GraphEdge> Stream successors(NodeAccessor graph, S sourceNode, Class targetNodeClass) {