1
0
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:
2017-08-07 18:57:43 -07:00
parent 61c5beffe7
commit 62e8971db2
10 changed files with 78 additions and 322 deletions

View 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") + ")"
}
}

View 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)
}
}

View 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()
}
}

View File

@@ -0,0 +1,7 @@
package org.nwapw.abacus.tree
abstract class TreeNode {
abstract fun <T: Any> reduce(reducer: Reducer<T>) : T?
}

View 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)
}
}