mirror of
https://github.com/AdrianKuta/Tree-Data-Structure.git
synced 2026-06-20 03:10:14 +02:00
BREAKING changes to the core: - treeIterator is now a read-only `val`; added `iterator(order)` and use `asSequence(order)`. - removeChild() only removes a direct child of the receiver; added `detach()` to unhook a node. - addChild() rejects re-parenting and cycles (throws TreeNodeException); detach() first to move. - clear() no longer nulls the receiver's own parent; only removes descendants. - path() returns List<TreeNode<T>>? (null) instead of throwing. Also: - Enable strict explicitApi() across core + both modules; add explicit `public` modifiers. - Update tests for the new contracts + add TreeNodeV4Test; refresh .api baselines. - README + CHANGELOG (with migration notes); bump version to 4.0.0. 47 JVM tests green.
31 lines
1.1 KiB
Kotlin
31 lines
1.1 KiB
Kotlin
package com.github.adriankuta.datastructure.tree.serialization
|
|
|
|
import com.github.adriankuta.datastructure.tree.TreeNode
|
|
import kotlinx.serialization.Serializable
|
|
|
|
/**
|
|
* A serializable, acyclic view of a [TreeNode] subtree. [TreeNode] itself holds a back-reference to
|
|
* its parent (a cycle), so it cannot be `@Serializable` directly — convert to/from this DTO instead.
|
|
*
|
|
* ```
|
|
* val json = Json.encodeToString(tree.toDto())
|
|
* val restored = Json.decodeFromString<TreeNodeDto<String>>(json).toTreeNode()
|
|
* ```
|
|
*/
|
|
@Serializable
|
|
public data class TreeNodeDto<T>(
|
|
public val value: T,
|
|
public val children: List<TreeNodeDto<T>> = emptyList(),
|
|
)
|
|
|
|
/** Converts this subtree into a serializable [TreeNodeDto], preserving values and shape. */
|
|
public fun <T> TreeNode<T>.toDto(): TreeNodeDto<T> =
|
|
TreeNodeDto(value, children.map { it.toDto() })
|
|
|
|
/** Rebuilds a mutable [TreeNode] tree from this DTO. */
|
|
public fun <T> TreeNodeDto<T>.toTreeNode(): TreeNode<T> {
|
|
val node = TreeNode(value)
|
|
children.forEach { node.addChild(it.toTreeNode()) }
|
|
return node
|
|
}
|