Skip to content

Commit 8fbcfdf

Browse files
Add Graph.toGraphSortedByEdges: Graph
1 parent 2298799 commit 8fbcfdf

File tree

5 files changed

+67
-0
lines changed

5 files changed

+67
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Added
66

7+
- `Graph.toGraphSortedByEdges: Graph`
8+
79
### Changed
810

911
### Deprecated

kotlin-stdlib/api/android/kotlin-stdlib.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ public abstract interface class com/javiersc/kotlin/stdlib/graph/Graph : java/ut
206206
public abstract fun renderer (Lkotlin/jvm/functions/Function1;)V
207207
public abstract fun setRenderer (Lkotlin/jvm/functions/Function1;)V
208208
public abstract fun toGraph ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
209+
public abstract fun toGraphSortedByEdges ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
209210
public abstract fun vertexesFor (Ljava/lang/Object;)Ljava/util/List;
210211
public abstract fun vertexesFor ([Ljava/lang/Object;)Ljava/util/List;
211212
}
@@ -222,6 +223,7 @@ public final class com/javiersc/kotlin/stdlib/graph/Graph$DefaultImpls {
222223
public static fun getHasMissingVertexes (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Z
223224
public static fun renderer (Lcom/javiersc/kotlin/stdlib/graph/Graph;Lkotlin/jvm/functions/Function1;)V
224225
public static fun toGraph (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Lcom/javiersc/kotlin/stdlib/graph/Graph;
226+
public static fun toGraphSortedByEdges (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Lcom/javiersc/kotlin/stdlib/graph/Graph;
225227
public static fun vertexesFor (Lcom/javiersc/kotlin/stdlib/graph/Graph;Ljava/lang/Object;)Ljava/util/List;
226228
public static fun vertexesFor (Lcom/javiersc/kotlin/stdlib/graph/Graph;[Ljava/lang/Object;)Ljava/util/List;
227229
}
@@ -313,6 +315,7 @@ public final class com/javiersc/kotlin/stdlib/graph/MutableGraph : com/javiersc/
313315
public fun setRenderer (Lkotlin/jvm/functions/Function1;)V
314316
public final fun size ()I
315317
public fun toGraph ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
318+
public fun toGraphSortedByEdges ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
316319
public fun toString ()Ljava/lang/String;
317320
public final fun values ()Ljava/util/Collection;
318321
public fun vertexesFor (Ljava/lang/Object;)Ljava/util/List;

kotlin-stdlib/api/jvm/kotlin-stdlib.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ public abstract interface class com/javiersc/kotlin/stdlib/graph/Graph : java/ut
212212
public abstract fun renderer (Lkotlin/jvm/functions/Function1;)V
213213
public abstract fun setRenderer (Lkotlin/jvm/functions/Function1;)V
214214
public abstract fun toGraph ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
215+
public abstract fun toGraphSortedByEdges ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
215216
public abstract fun vertexesFor (Ljava/lang/Object;)Ljava/util/List;
216217
public abstract fun vertexesFor ([Ljava/lang/Object;)Ljava/util/List;
217218
}
@@ -228,6 +229,7 @@ public final class com/javiersc/kotlin/stdlib/graph/Graph$DefaultImpls {
228229
public static fun getHasMissingVertexes (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Z
229230
public static fun renderer (Lcom/javiersc/kotlin/stdlib/graph/Graph;Lkotlin/jvm/functions/Function1;)V
230231
public static fun toGraph (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Lcom/javiersc/kotlin/stdlib/graph/Graph;
232+
public static fun toGraphSortedByEdges (Lcom/javiersc/kotlin/stdlib/graph/Graph;)Lcom/javiersc/kotlin/stdlib/graph/Graph;
231233
public static fun vertexesFor (Lcom/javiersc/kotlin/stdlib/graph/Graph;Ljava/lang/Object;)Ljava/util/List;
232234
public static fun vertexesFor (Lcom/javiersc/kotlin/stdlib/graph/Graph;[Ljava/lang/Object;)Ljava/util/List;
233235
}
@@ -319,6 +321,7 @@ public final class com/javiersc/kotlin/stdlib/graph/MutableGraph : com/javiersc/
319321
public fun setRenderer (Lkotlin/jvm/functions/Function1;)V
320322
public final fun size ()I
321323
public fun toGraph ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
324+
public fun toGraphSortedByEdges ()Lcom/javiersc/kotlin/stdlib/graph/Graph;
322325
public fun toString ()Ljava/lang/String;
323326
public final fun values ()Ljava/util/Collection;
324327
public fun vertexesFor (Ljava/lang/Object;)Ljava/util/List;

kotlin-stdlib/common/main/kotlin/com/javiersc/kotlin/stdlib/graph/Graph.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,34 @@ public interface Graph<T> : Map<Graph.Vertex<T>, List<Graph.Edge<T>>> {
6161

6262
public fun vertexesFor(vararg values: T): List<T> = values.flatMap(::vertexesFor)
6363

64+
public fun toGraphSortedByEdges(): Graph<T> = buildGraph {
65+
val sortedGraph: MutableGraph<T> = this
66+
val graph: Graph<T> = this@Graph
67+
val remainingMap: MutableMap<Vertex<T>, List<Edge<T>>> = graph.toMutableMap()
68+
while (remainingMap.isNotEmpty()) {
69+
val vertexesToBeRemoved: MutableList<Vertex<T>> = mutableListOf()
70+
for ((vertex: Vertex<T>, edges: List<Edge<T>>) in remainingMap) {
71+
if (edges.isEmpty()) {
72+
sortedGraph.addVertex(vertex.value)
73+
vertexesToBeRemoved.add(vertex)
74+
println()
75+
}
76+
for (edge: Edge<T> in edges) {
77+
if (edge.destination.value in sortedGraph.keys.map(Vertex<T>::value)) {
78+
sortedGraph.addVertex(edge.source.value)
79+
sortedGraph.addEdge(edge.source.value, edge.destination.value)
80+
vertexesToBeRemoved.add(edge.source)
81+
println()
82+
}
83+
}
84+
}
85+
for (vertexToBeRemoved: Vertex<T> in vertexesToBeRemoved) {
86+
remainingMap.remove(vertexToBeRemoved)
87+
}
88+
vertexesToBeRemoved.clear()
89+
}
90+
}
91+
6492
public fun renderer(block: Any?.() -> String) {
6593
this.renderer = block
6694
}

kotlin-stdlib/common/test/kotlin/com/javiersc/kotlin/stdlib/GraphTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,37 @@ class GraphTest {
310310
assertTrue { graph.vertexesFor(Qux) == listOf(Quux) }
311311
assertTrue { graph.vertexesFor(Quux) == emptyList<A>() }
312312
}
313+
314+
@Test
315+
fun vertexes_sorted_by_edges() {
316+
val graph: Graph<A> = buildGraph {
317+
addVertex(Bar)
318+
addVertex(Foo)
319+
addVertex(Baz)
320+
addEdge(Bar, Baz)
321+
addEdge(Foo, Bar)
322+
}
323+
324+
assertTrue {
325+
val actual: String = graph.toString()
326+
val expect: String = buildString {
327+
appendLine("Bar -> [Baz]")
328+
appendLine("Foo -> [Bar]")
329+
appendLine("Baz -> []")
330+
}
331+
expect == actual
332+
}
333+
334+
assertTrue {
335+
val actual: String = graph.toGraphSortedByEdges().toString()
336+
val expect: String = buildString {
337+
appendLine("Baz -> []")
338+
appendLine("Bar -> [Baz]")
339+
appendLine("Foo -> [Bar]")
340+
}
341+
expect == actual
342+
}
343+
}
313344
}
314345

315346
private object Foo : A()

0 commit comments

Comments
 (0)