Skip to content

Commit

Permalink
refactor: 💡 extract traversal actions to outer
Browse files Browse the repository at this point in the history
  • Loading branch information
Xanonymous-GitHub committed Jul 21, 2024
1 parent b81405a commit e032f6f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 22 deletions.
34 changes: 16 additions & 18 deletions core/src/main/kotlin/tw/xcc/gumtree/helper/TraversalHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,38 +4,36 @@ import tw.xcc.gumtree.api.tree.Tree

private fun <T : Tree> preOrderedImpl(
tree: T,
visited: MutableList<T>
action: (T) -> Unit
) {
visited.add(tree)
action(tree)
tree.getChildren().forEach {
@Suppress("UNCHECKED_CAST")
preOrderedImpl(it as T, visited)
preOrderedImpl(it as T, action)
}
}

private fun <T : Tree> postOrderedImpl(
tree: T,
visited: MutableList<T>
action: (T) -> Unit
) {
tree.getChildren().forEach {
@Suppress("UNCHECKED_CAST")
postOrderedImpl(it as T, visited)
postOrderedImpl(it as T, action)
}
visited.add(tree)
action(tree)
}

fun <T : Tree> preOrdered(tree: T): List<T> {
synchronized(tree) {
val visited = mutableListOf<T>()
preOrderedImpl(tree, visited)
return visited.toList()
}
fun <T : Tree> preOrdered(
tree: T,
action: (T) -> Unit
) = synchronized(tree) {
preOrderedImpl(tree, action)
}

fun <T : Tree> postOrdered(tree: T): List<T> {
synchronized(tree) {
val visited = mutableListOf<T>()
postOrderedImpl(tree, visited)
return visited.toList()
}
fun <T : Tree> postOrdered(
tree: T,
action: (T) -> Unit
) = synchronized(tree) {
postOrderedImpl(tree, action)
}
16 changes: 12 additions & 4 deletions core/src/main/kotlin/tw/xcc/gumtree/model/BasicTree.kt
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,24 @@ abstract class BasicTree<T> : Tree, Traversable<T> where T : BasicTree<T> {
}
}

final override fun preOrdered(): List<T> {
val result = mutableListOf<T>()
preOrdered(self) { result.add(it) }
return result
}

final override fun postOrdered(): List<T> {
val result = mutableListOf<T>()
postOrdered(self) { result.add(it) }
return result
}

final override fun getParent(): T? = synchronized(this) { parent.get() }

final override fun getChildren(): List<T> = synchronized(this) { childrenMap.get().values.toList() }

final override fun childAt(i: Int): T? = synchronized(this) { childrenMap.get()[i] }

final override fun preOrdered(): List<T> = preOrdered(self)

final override fun postOrdered(): List<T> = postOrdered(self)

final override fun childCount(): Int = synchronized(this) { childrenMap.get().size }

final override fun isRoot(): Boolean = synchronized(this) { parent.get() == null }
Expand Down

0 comments on commit e032f6f

Please sign in to comment.