mirror of
https://github.com/DanilaFe/abacus
synced 2026-01-13 10:25:20 +00:00
Rewrite tree nodes in Kotlin. Documentation pending.
This commit is contained in:
15
src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt
Normal file
15
src/main/kotlin/org/nwapw/abacus/tree/BinaryNode.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package org.nwapw.abacus.tree
|
||||
|
||||
data class BinaryNode(val operation: String, val left: TreeNode? = null, val right: TreeNode?) : TreeNode() {
|
||||
|
||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||
val leftReduce = left?.reduce(reducer) ?: return null
|
||||
val rightReduce = right?.reduce(reducer) ?: return null
|
||||
return reducer.reduceNode(this, leftReduce, rightReduce)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "(" + (left?.toString() ?: "null") + operation + (right?.toString() ?: "null") + ")"
|
||||
}
|
||||
|
||||
}
|
||||
31
src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt
Normal file
31
src/main/kotlin/org/nwapw/abacus/tree/FunctionNode.kt
Normal file
@@ -0,0 +1,31 @@
|
||||
package org.nwapw.abacus.tree
|
||||
|
||||
data class FunctionNode(val function: String) : TreeNode() {
|
||||
|
||||
val children: MutableList<TreeNode> = mutableListOf()
|
||||
|
||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||
val children = Array<Any?>(children.size, { children[it].reduce(reducer) ?: return null; })
|
||||
return reducer.reduceNode(this, *children)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
val buffer = StringBuffer()
|
||||
buffer.append(function)
|
||||
buffer.append('(')
|
||||
for (i in 0 until children.size) {
|
||||
buffer.append(children[i].toString())
|
||||
buffer.append(if (i == children.size - 1) ")" else ",")
|
||||
}
|
||||
return super.toString()
|
||||
}
|
||||
|
||||
fun appendChild(node: TreeNode){
|
||||
children.add(node)
|
||||
}
|
||||
|
||||
fun prependChild(node: TreeNode){
|
||||
children.add(0, node)
|
||||
}
|
||||
|
||||
}
|
||||
15
src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt
Normal file
15
src/main/kotlin/org/nwapw/abacus/tree/NumberNode.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package org.nwapw.abacus.tree
|
||||
|
||||
import org.nwapw.abacus.number.NumberInterface
|
||||
|
||||
data class NumberNode(val number: NumberInterface) : TreeNode() {
|
||||
|
||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||
return reducer.reduceNode(this)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return number.toString()
|
||||
}
|
||||
|
||||
}
|
||||
7
src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt
Normal file
7
src/main/kotlin/org/nwapw/abacus/tree/TreeNode.kt
Normal file
@@ -0,0 +1,7 @@
|
||||
package org.nwapw.abacus.tree
|
||||
|
||||
abstract class TreeNode {
|
||||
|
||||
abstract fun <T: Any> reduce(reducer: Reducer<T>) : T?
|
||||
|
||||
}
|
||||
10
src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt
Normal file
10
src/main/kotlin/org/nwapw/abacus/tree/UnaryNode.kt
Normal file
@@ -0,0 +1,10 @@
|
||||
package org.nwapw.abacus.tree
|
||||
|
||||
data class UnaryNode(val operation: String, val applyTo: TreeNode? = null) : TreeNode() {
|
||||
|
||||
override fun <T : Any> reduce(reducer: Reducer<T>): T? {
|
||||
val reducedChild = applyTo?.reduce(reducer) ?: return null
|
||||
return reducer.reduceNode(this, reducedChild)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user