Files
Tree-Data-Structure/README.md
Adrian Kuta 54f5074483 26-add-ios-target (#28)
* Refactor: Modernize build and publishing workflow

- Upgraded Kotlin from 1.7.20 to 1.9.20.
- Upgraded JDK from 11 to 21 across all GitHub Actions workflows.
- Replaced the legacy `maven-publish` plugin with `com.vanniktech.maven.publish` for simplified publishing to Maven Central.
- Removed the `publishSnapshot.yml` workflow, as snapshot publishing is now managed by the new plugin.
- Updated `publishRelease.yml` to use the `publishToMavenCentral` task and new secrets (`MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD`).
- Simplified `build.gradle.kts` by removing manual publishing and signing logic.
- Set the JVM target to "21".
- Bumped the project version to `3.1.1`.
- Removed `js` targets and related configurations.
- Added a new code style configuration file for the project (`.idea/codeStyles/Project.xml`).

* fix: Add JavaScript targets

- Added JS (IR) targets (`browser` and `nodejs`) to the Kotlin Multiplatform configuration for publishing.

* Improve README and document new publishing workflow

- Expanded the project description to highlight key features like Kotlin Multiplatform support, traversal iterators, DSL, and utility functions.
- Added a new "Installation" section with instructions for Gradle (Kotlin/Groovy) and Maven.
- Added a "Traversal and utilities" section to demonstrate usage of iterators and helper functions.
- Replaced the old publishing documentation with updated instructions for publishing to Maven Central via the Central Portal.
- Detailed the two publishing methods: automatically via GitHub Actions on release and manually via local Gradle commands.
- Clarified required secrets and environment variables for the new publishing process.
2025-10-14 18:46:05 +02:00

6.3 KiB
Raw Blame History

Tree (Data Structure)

maven License: MIT Publish

Lightweight Kotlin Multiplatform tree data structure for Kotlin and Java. Includes a small DSL, multiple traversal iterators, and pretty-print support.

  • Kotlin Multiplatform (JVM, JS, iOS, and Native host)
  • Pre-order, Post-order, and Level-order iteration
  • Simple DSL: tree { child(...) }
  • Utilities: nodeCount(), height(), depth(), path(), prettyString(), clear(), removeChild()

Installation

Gradle (Kotlin DSL):

// commonMain for KMP projects, or any sourceSet/module where you need it
dependencies {
    implementation("com.github.adriankuta:tree-structure:3.1.1") // see badge above for the latest version
}

Gradle (Groovy):

dependencies {
    implementation "com.github.adriankuta:tree-structure:3.1.1" // see badge above for the latest
}

Maven:

<dependency>
  <groupId>com.github.adriankuta</groupId>
  <artifactId>tree-structure</artifactId>
  <version>3.1.1</version>
</dependency>

Usage

Kotlin

val root = TreeNode("World")
val northA = TreeNode("North America")
val europe = TreeNode("Europe")
root.addChild(northA)
root.addChild(europe)

val usa = TreeNode("USA")
northA.addChild(usa)

val poland = TreeNode("Poland")
val france = TreeNode("France")
europe.addChild(poland)
europe.addChild(france)
println(root.prettyString())

Pretty Kotlin (DSL)

val root = tree("World") {
    child("North America") { child("USA") }
    child("Europe") {
        child("Poland")
        child("Germany")
    }
}

Java

TreeNode<String> root = new TreeNode<>("World");
TreeNode<String> northA = new TreeNode<>("North America");
TreeNode<String> europe = new TreeNode<>("Europe");
root.addChild(northA);
root.addChild(europe);

TreeNode<String> usa = new TreeNode<>("USA");
northA.addChild(usa);

TreeNode<String> poland = new TreeNode<>("Poland");
TreeNode<String> france = new TreeNode<>("France");
europe.addChild(poland);
europe.addChild(france);
System.out.println(root.prettyString());

Output:

World
├── North America
│   └── USA
└── Europe
    ├── Poland
    └── France

Traversal and utilities

val root = TreeNode("root")
// ... build your tree

// Choose iteration order (default is PreOrder)
root.treeIterator = TreeNodeIterators.PostOrder
for (node in root) println(node.value)

// Utilities
root.nodeCount()   // number of descendants
root.height()      // longest path to a leaf (in edges)
root.depth()       // distance from current node to the root
val path = root.path(root.children.first()) // nodes from descendant up to root

// Mutations
val child = root.children.first()
root.removeChild(child)
root.clear()       // remove entire subtree

Publishing to Maven Central (central.sonatype.com)

This project is configured to publish artifacts to Maven Central via the Sonatype Central Portal.

There are two supported ways to publish:

  1. Via GitHub Actions (recommended)
  • Create a GitHub Release (tag) in this repository. When a release is published, the workflow .github/workflows/publishRelease.yml runs automatically.
  • The workflow uses the Gradle task publishToMavenCentral to upload artifacts through the Central Portal.
  • Make sure these repository secrets are configured in GitHub:
    • MAVEN_CENTRAL_USERNAME — Your Sonatype Central username (not email).
    • MAVEN_CENTRAL_PASSWORD — Your Sonatype Central password or a token from central.sonatype.com.
    • SIGNING_KEY — ASCIIarmored GPG private key (exported, single line; for inmemory signing).
    • SIGNING_PASSWORD — Passphrase for the key above.
  • The workflow uses JDK 21 and publishes the version defined in build.gradle.kts.
  1. Locally via Gradle
  • Ensure you have a Sonatype Central account and that the groupId com.github.adriankuta is verified in central.sonatype.com (Namespace Rules → Verify).
  • Export the same credentials/signing values as environment variables or pass them as Gradle properties:
    • ORG_GRADLE_PROJECT_mavenCentralUsername
    • ORG_GRADLE_PROJECT_mavenCentralPassword
    • ORG_GRADLE_PROJECT_signingInMemoryKey
    • ORG_GRADLE_PROJECT_signingInMemoryKeyPassword
  • Then run:
    • ./gradlew publishToMavenCentral
  • For snapshot publishing, set -Psnapshot=true (the version is derived from PUBLISH_VERSION with -SNAPSHOT).

Notes

  • Publishing is powered by the com.vanniktech.maven.publish Gradle plugin and Sonatype Central Portal (no legacy Nexus staging URLs needed).
  • The plugin is configured to sign all publications. Coordinates and POM metadata are defined in build.gradle.kts.
  • If using the combined task is preferred, you can also run publishAndReleaseToMavenCentral when automatic release is enabled; this repository currently uploads with publishToMavenCentral from CI.

License

MIT License

Copyright (c) 2020 Adrian Kuta

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.