Skip to content

Commit 4c295e0

Browse files
Add TreeNode data structure
1 parent 79786b0 commit 4c295e0

File tree

13 files changed

+948
-3
lines changed

13 files changed

+948
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Added
66

7+
- `TreeNode` data structure
78
- `String.removeIf`
89

910
### Changed

kotlin-stdlib/api/android/kotlin-stdlib.api

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,71 @@ public final class com/javiersc/kotlin/stdlib/StringsTransformKt {
191191
public static final fun transformstring (Ljava/lang/String;)Ljava/lang/String;
192192
}
193193

194+
public abstract interface class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface {
195+
public abstract synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
196+
}
197+
198+
public final class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface$DefaultImpls {
199+
public static synthetic fun child$default (Lcom/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
200+
}
201+
202+
public final class com/javiersc/kotlin/stdlib/tree/LevelOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
203+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
204+
public fun hasNext ()Z
205+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
206+
public synthetic fun next ()Ljava/lang/Object;
207+
public fun remove ()V
208+
}
209+
210+
public final class com/javiersc/kotlin/stdlib/tree/PostOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
211+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
212+
public fun hasNext ()Z
213+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
214+
public synthetic fun next ()Ljava/lang/Object;
215+
public fun remove ()V
216+
}
217+
218+
public final class com/javiersc/kotlin/stdlib/tree/PreOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
219+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
220+
public fun hasNext ()Z
221+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
222+
public synthetic fun next ()Ljava/lang/Object;
223+
public fun remove ()V
224+
}
225+
226+
public class com/javiersc/kotlin/stdlib/tree/TreeNode : com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface, java/lang/Iterable, kotlin/jvm/internal/markers/KMappedMarker {
227+
public fun <init> (Ljava/lang/Object;)V
228+
public final fun addChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
229+
public synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
230+
public final fun clear ()V
231+
public final fun getChildren ()Ljava/util/List;
232+
public final fun getDefaultIterator ()Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
233+
public final fun getDepth ()I
234+
public final fun getHeight ()I
235+
public final fun getNodeCount ()I
236+
public final fun getParent ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
237+
public final fun getValue ()Ljava/lang/Object;
238+
public final fun isRoot ()Z
239+
public fun iterator ()Ljava/util/Iterator;
240+
public final fun path (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Ljava/util/List;
241+
public final fun prettyString ()Ljava/lang/String;
242+
public final fun removeChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Z
243+
public final fun setDefaultIterator (Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;)V
244+
public fun toString ()Ljava/lang/String;
245+
}
246+
247+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeException : java/lang/RuntimeException {
248+
public fun <init> ()V
249+
public fun <init> (Ljava/lang/String;)V
250+
public fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V
251+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
252+
}
253+
254+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeIterators : java/lang/Enum {
255+
public static final field LevelOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
256+
public static final field PostOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
257+
public static final field PreOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
258+
public static fun valueOf (Ljava/lang/String;)Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
259+
public static fun values ()[Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
260+
}
261+

kotlin-stdlib/api/jvm/kotlin-stdlib.api

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,71 @@ public final class com/javiersc/kotlin/stdlib/StringsTransformKt {
197197
public static final fun transformstring (Ljava/lang/String;)Ljava/lang/String;
198198
}
199199

200+
public abstract interface class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface {
201+
public abstract synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
202+
}
203+
204+
public final class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface$DefaultImpls {
205+
public static synthetic fun child$default (Lcom/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
206+
}
207+
208+
public final class com/javiersc/kotlin/stdlib/tree/LevelOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
209+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
210+
public fun hasNext ()Z
211+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
212+
public synthetic fun next ()Ljava/lang/Object;
213+
public fun remove ()V
214+
}
215+
216+
public final class com/javiersc/kotlin/stdlib/tree/PostOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
217+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
218+
public fun hasNext ()Z
219+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
220+
public synthetic fun next ()Ljava/lang/Object;
221+
public fun remove ()V
222+
}
223+
224+
public final class com/javiersc/kotlin/stdlib/tree/PreOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
225+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
226+
public fun hasNext ()Z
227+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
228+
public synthetic fun next ()Ljava/lang/Object;
229+
public fun remove ()V
230+
}
231+
232+
public class com/javiersc/kotlin/stdlib/tree/TreeNode : com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface, java/lang/Iterable, kotlin/jvm/internal/markers/KMappedMarker {
233+
public fun <init> (Ljava/lang/Object;)V
234+
public final fun addChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
235+
public synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
236+
public final fun clear ()V
237+
public final fun getChildren ()Ljava/util/List;
238+
public final fun getDefaultIterator ()Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
239+
public final fun getDepth ()I
240+
public final fun getHeight ()I
241+
public final fun getNodeCount ()I
242+
public final fun getParent ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
243+
public final fun getValue ()Ljava/lang/Object;
244+
public final fun isRoot ()Z
245+
public fun iterator ()Ljava/util/Iterator;
246+
public final fun path (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Ljava/util/List;
247+
public final fun prettyString ()Ljava/lang/String;
248+
public final fun removeChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Z
249+
public final fun setDefaultIterator (Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;)V
250+
public fun toString ()Ljava/lang/String;
251+
}
252+
253+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeException : java/lang/RuntimeException {
254+
public fun <init> ()V
255+
public fun <init> (Ljava/lang/String;)V
256+
public fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V
257+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
258+
}
259+
260+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeIterators : java/lang/Enum {
261+
public static final field LevelOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
262+
public static final field PostOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
263+
public static final field PreOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
264+
public static fun valueOf (Ljava/lang/String;)Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
265+
public static fun values ()[Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
266+
}
267+

kotlin-stdlib/api/kotlin-stdlib.api

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ public final class com/javiersc/kotlin/stdlib/AnsiColorsKt {
142142
}
143143

144144
public final class com/javiersc/kotlin/stdlib/CollectionsKt {
145+
public static final fun capitalize (Ljava/lang/String;)Ljava/lang/String;
146+
public static final fun decapitalize (Ljava/lang/String;)Ljava/lang/String;
145147
public static final fun fifth (Ljava/lang/Iterable;)Ljava/lang/Object;
146148
public static final fun fifthOrNull (Ljava/lang/Iterable;)Ljava/lang/Object;
147149
public static final fun forth (Ljava/lang/Iterable;)Ljava/lang/Object;
@@ -157,6 +159,12 @@ public final class com/javiersc/kotlin/stdlib/CollectionsKt {
157159
public static final fun thirdOrNull (Ljava/lang/Iterable;)Ljava/lang/Object;
158160
}
159161

162+
public final class com/javiersc/kotlin/stdlib/FilesKt {
163+
public static final fun getChildren (Ljava/io/File;)Lkotlin/sequences/Sequence;
164+
public static final fun resource (Ljava/lang/String;)Ljava/io/File;
165+
public static final fun resourceOrNull (Ljava/lang/String;)Ljava/io/File;
166+
}
167+
160168
public final class com/javiersc/kotlin/stdlib/StringsKt {
161169
public static final fun endWithNewLine (Ljava/lang/String;)Ljava/lang/String;
162170
public static final fun getEmpty (Lkotlin/jvm/internal/StringCompanionObject;)Ljava/lang/String;
@@ -168,9 +176,91 @@ public final class com/javiersc/kotlin/stdlib/StringsKt {
168176
public static final fun notContain (Ljava/lang/CharSequence;Lkotlin/text/Regex;)Z
169177
public static synthetic fun notContain$default (Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z
170178
public static final fun remove (Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;
171-
public static final fun remove (Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
179+
public static final fun remove (Ljava/lang/String;[Ljava/lang/String;Z)Ljava/lang/String;
172180
public static synthetic fun remove$default (Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String;
181+
public static synthetic fun remove$default (Ljava/lang/String;[Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String;
173182
public static final fun removeDuplicateEmptyLines (Ljava/lang/String;)Ljava/lang/String;
183+
public static final fun removeIf (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/lang/String;
184+
public static synthetic fun removeIf$default (Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String;
174185
public static final fun replace (Ljava/lang/String;[Lkotlin/Pair;)Ljava/lang/String;
175186
}
176187

188+
public final class com/javiersc/kotlin/stdlib/StringsTransformKt {
189+
public static final fun TRANSFORMSTRING (Ljava/lang/String;)Ljava/lang/String;
190+
public static final fun TRANSFORM_HYPHEN_STRING (Ljava/lang/String;)Ljava/lang/String;
191+
public static final fun TRANSFORM_STRING (Ljava/lang/String;)Ljava/lang/String;
192+
public static final fun TransformString (Ljava/lang/String;)Ljava/lang/String;
193+
public static final fun tRaNsFoRmStRiNg (Ljava/lang/String;)Ljava/lang/String;
194+
public static final fun transformString (Ljava/lang/String;)Ljava/lang/String;
195+
public static final fun transform_hyphen_string (Ljava/lang/String;)Ljava/lang/String;
196+
public static final fun transform_string (Ljava/lang/String;)Ljava/lang/String;
197+
public static final fun transformstring (Ljava/lang/String;)Ljava/lang/String;
198+
}
199+
200+
public abstract interface class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface {
201+
public abstract synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
202+
}
203+
204+
public final class com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface$DefaultImpls {
205+
public static synthetic fun child$default (Lcom/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
206+
}
207+
208+
public final class com/javiersc/kotlin/stdlib/tree/LevelOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
209+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
210+
public fun hasNext ()Z
211+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
212+
public synthetic fun next ()Ljava/lang/Object;
213+
public fun remove ()V
214+
}
215+
216+
public final class com/javiersc/kotlin/stdlib/tree/PostOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
217+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
218+
public fun hasNext ()Z
219+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
220+
public synthetic fun next ()Ljava/lang/Object;
221+
public fun remove ()V
222+
}
223+
224+
public final class com/javiersc/kotlin/stdlib/tree/PreOrderTreeIterator : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker {
225+
public fun <init> (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
226+
public fun hasNext ()Z
227+
public fun next ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
228+
public synthetic fun next ()Ljava/lang/Object;
229+
public fun remove ()V
230+
}
231+
232+
public class com/javiersc/kotlin/stdlib/tree/TreeNode : com/javiersc/kotlin/stdlib/tree/ChildDeclarationInterface, java/lang/Iterable, kotlin/jvm/internal/markers/KMappedMarker {
233+
public fun <init> (Ljava/lang/Object;)V
234+
public final fun addChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)V
235+
public synthetic fun child (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
236+
public final fun clear ()V
237+
public final fun getChildren ()Ljava/util/List;
238+
public final fun getDefaultIterator ()Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
239+
public final fun getDepth ()I
240+
public final fun getHeight ()I
241+
public final fun getNodeCount ()I
242+
public final fun getParent ()Lcom/javiersc/kotlin/stdlib/tree/TreeNode;
243+
public final fun getValue ()Ljava/lang/Object;
244+
public final fun isRoot ()Z
245+
public fun iterator ()Ljava/util/Iterator;
246+
public final fun path (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Ljava/util/List;
247+
public final fun prettyString ()Ljava/lang/String;
248+
public final fun removeChild (Lcom/javiersc/kotlin/stdlib/tree/TreeNode;)Z
249+
public final fun setDefaultIterator (Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;)V
250+
public fun toString ()Ljava/lang/String;
251+
}
252+
253+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeException : java/lang/RuntimeException {
254+
public fun <init> ()V
255+
public fun <init> (Ljava/lang/String;)V
256+
public fun <init> (Ljava/lang/String;Ljava/lang/Throwable;)V
257+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
258+
}
259+
260+
public final class com/javiersc/kotlin/stdlib/tree/TreeNodeIterators : java/lang/Enum {
261+
public static final field LevelOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
262+
public static final field PostOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
263+
public static final field PreOrder Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
264+
public static fun valueOf (Ljava/lang/String;)Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
265+
public static fun values ()[Lcom/javiersc/kotlin/stdlib/tree/TreeNodeIterators;
266+
}

kotlin-stdlib/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import com.javiersc.gradle.properties.extensions.getBooleanProperty
2+
13
hubdle {
24
config {
35
analysis()
@@ -19,7 +21,7 @@ hubdle {
1921
}
2022

2123
common()
22-
android()
24+
if (getBooleanProperty("android.enabled").orElse(true).get()) android()
2325
androidNative {
2426
androidNativeArm32()
2527
androidNativeArm64()
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.javiersc.kotlin.stdlib.tree
2+
3+
/**
4+
* Tree is iterated by using `Level-order Traversal Algorithm" In level-order traversal we iterating
5+
* nodes level by level, starting from root, and going deeper and deeper in tree.
6+
*
7+
* ```
8+
* E.g.
9+
* 1
10+
* / | \
11+
* / | \
12+
* 2 3 4
13+
* / \ / | \
14+
* 5 6 7 8 9
15+
* / / | \
16+
* 10 11 12 13
17+
*
18+
* Output: 1 2 3 4 5 6 7 8 9 10 11 12 13
19+
* ```
20+
*/
21+
public class LevelOrderTreeIterator<T>(root: TreeNode<T>) : Iterator<TreeNode<T>> {
22+
23+
private val stack = ArrayDeque<TreeNode<T>>()
24+
25+
init {
26+
stack.addLast(root)
27+
}
28+
29+
override fun hasNext(): Boolean = stack.isNotEmpty()
30+
31+
override fun next(): TreeNode<T> {
32+
val node = stack.removeFirst()
33+
node.children.forEach { stack.addLast(it) }
34+
return node
35+
}
36+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.javiersc.kotlin.stdlib.tree
2+
3+
/**
4+
* Tree is iterated by using `Post-order Traversal Algorithm" In post-order traversal, we starting
5+
* from most left child. First visit all children of parent, then parent.
6+
*
7+
* ```
8+
* E.g.
9+
* 1
10+
* / | \
11+
* / | \
12+
* 2 3 4
13+
* / \ / | \
14+
* 5 6 7 8 9
15+
* / / | \
16+
* 10 11 12 13
17+
*
18+
* Output: 10 5 11 12 13 6 2 3 7 8 9 4 1
19+
* ```
20+
*/
21+
public class PostOrderTreeIterator<T>(root: TreeNode<T>) : Iterator<TreeNode<T>> {
22+
23+
private val stack = ArrayDeque<TreeNode<T>>()
24+
25+
init {
26+
stack.addAll(getChildrenStack(root))
27+
}
28+
29+
override fun hasNext(): Boolean = stack.isNotEmpty()
30+
31+
override fun next(): TreeNode<T> {
32+
return stack.removeFirst()
33+
}
34+
35+
private fun getChildrenStack(node: TreeNode<T>): ArrayDeque<TreeNode<T>> {
36+
val stack = ArrayDeque<TreeNode<T>>()
37+
if (node.children.isEmpty()) {
38+
return ArrayDeque(listOf(node))
39+
}
40+
node.children.forEach { stack.addAll(getChildrenStack(it)) }
41+
stack.addLast(node)
42+
return stack
43+
}
44+
}

0 commit comments

Comments
 (0)