Skip to content

Commit

Permalink
Add more edge functions
Browse files Browse the repository at this point in the history
  • Loading branch information
robotgryphon committed Feb 17, 2024
1 parent 2d1271b commit bbc27b5
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 21 deletions.
23 changes: 12 additions & 11 deletions src/main/java/dev/compactmods/feather/MemoryGraph.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -105,25 +107,24 @@ public <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>>
}

@Override
public <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> edges(GraphEdgeLookupFunction<SN, TN> func) {
return func.edges(this);
public <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> inboundEdges(TN targetNode, Class<SN> sourceNodeClass) {
return GraphTraversalHelper.predecessors(this, targetNode, sourceNodeClass)
.map(sn -> graph.edgeValue(sn, targetNode).orElse(null))
.filter(Objects::nonNull)
.map(e -> {
//noinspection unchecked
return (GraphEdge<SN, TN>) e;
});
}

@Override
public <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> outboundEdges(SN sourceNode, Class<TN> 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 -> {
//noinspection unchecked
return (GraphEdge<SN, TN>) e;
});
}

@Override
public <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> outboundEdges(OutboundGraphEdgeLookupFunction<SN, TN> func, SN sourceNode) {
return func.getOutboundEdges(this, sourceNode);
}
}
26 changes: 24 additions & 2 deletions src/main/java/dev/compactmods/feather/edge/GraphEdgeAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,31 @@ public interface GraphEdgeAccessor {

<S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> edges(Class<SN> sourceNodeType, Class<TN> targetNodeType);

<S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> edges(GraphEdgeLookupFunction<SN, TN> func);
default <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> edges(GraphEdgeLookupFunction<SN, TN> func) {
return func.edges(this);
}

<S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> inboundEdges(TN targetNode, Class<SN> sourceNodeClass);

default <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> inboundEdges(InboundGraphEdgeLookupFunction<SN, TN> func, TN targetNode) {
return func.getInboundEdges(this, targetNode);
}

default <S, SN extends Node<S>, T, TN extends Node<T>, E extends GraphEdge<SN, TN>> Stream<E> inboundEdges(TN targetNode, Class<SN> sourceNodeClass, Class<E> edgeClass) {
return inboundEdges(targetNode, sourceNodeClass)
.filter(edgeClass::isInstance)
.map(edgeClass::cast);
}

<S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> outboundEdges(SN sourceNode, Class<TN> targetNodeClass);

<S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> outboundEdges(OutboundGraphEdgeLookupFunction<SN, TN> func, SN sourceNode);
default <S, SN extends Node<S>, T, TN extends Node<T>> Stream<GraphEdge<SN, TN>> outboundEdges(OutboundGraphEdgeLookupFunction<SN, TN> func, SN sourceNode) {
return func.getOutboundEdges(this, sourceNode);
}

default <S, SN extends Node<S>, T, TN extends Node<T>, E extends GraphEdge<SN, TN>> Stream<E> outboundEdges(SN sourceNode, Class<TN> targetNodeClass, Class<E> edgeClass) {
return outboundEdges(sourceNode, targetNodeClass)
.filter(edgeClass::isInstance)
.map(edgeClass::cast);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.compactmods.feather.edge;

import dev.compactmods.feather.node.Node;

import java.util.stream.Stream;

@FunctionalInterface
public interface InboundGraphEdgeLookupFunction<SN extends Node<?>, TN extends Node<?>> {
Stream<GraphEdge<SN, TN>> getInboundEdges(GraphEdgeAccessor graph, TN originNode);
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package dev.compactmods.feather.node;

import dev.compactmods.feather.graph.NodeAccessor;

import java.util.stream.Stream;

@FunctionalInterface
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.compactmods.feather.graph;
package dev.compactmods.feather.node;

import dev.compactmods.feather.node.Node;

Expand All @@ -13,4 +13,5 @@ public interface NodeAccessor {
<T extends Node<?>> Stream<Node<?>> predecessors(T sourceNode);

<T extends Node<?>> Stream<Node<?>> successors(T sourceNode);

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,10 +15,10 @@ public static <SD, S extends Node<SD>, TD, T extends Node<TD>, Edge extends Grap
.map(type::cast);
}

public static <SD, S extends Node<SD>, TD, T extends Node<TD>, Edge extends GraphEdge<S, T>> Stream<T> predecessors(NodeAccessor graph, S sourceNode, Class<T> targetNodeClass) {
return graph.predecessors(sourceNode)
.filter(targetNodeClass::isInstance)
.map(targetNodeClass::cast);
public static <SD, S extends Node<SD>, TD, T extends Node<TD>, Edge extends GraphEdge<S, T>> Stream<S> predecessors(NodeAccessor graph, T targetNode, Class<S> sourceNodeClass) {
return graph.predecessors(targetNode)
.filter(sourceNodeClass::isInstance)
.map(sourceNodeClass::cast);
}

public static <SD, S extends Node<SD>, TD, T extends Node<TD>, Edge extends GraphEdge<S, T>> Stream<T> successors(NodeAccessor graph, S sourceNode, Class<T> targetNodeClass) {
Expand Down

0 comments on commit bbc27b5

Please sign in to comment.