aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/pages/PageNodes.kt
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/kotlin/pages/PageNodes.kt')
-rw-r--r--core/src/main/kotlin/pages/PageNodes.kt92
1 files changed, 61 insertions, 31 deletions
diff --git a/core/src/main/kotlin/pages/PageNodes.kt b/core/src/main/kotlin/pages/PageNodes.kt
index 9274ac2b..80b21547 100644
--- a/core/src/main/kotlin/pages/PageNodes.kt
+++ b/core/src/main/kotlin/pages/PageNodes.kt
@@ -7,18 +7,57 @@ import java.util.*
interface PageNode {
val name: String
+ val children: List<PageNode>
+
+ fun modified(
+ name: String = this.name,
+ children: List<PageNode> = this.children
+ ): PageNode
+}
+
+interface ContentPage: PageNode {
val content: ContentNode
val dri: DRI
val documentable: Documentable?
val embeddedResources: List<String>
- val children: List<PageNode>
fun modified(
name: String = this.name,
content: ContentNode = this.content,
embeddedResources: List<String> = this.embeddedResources,
children: List<PageNode> = this.children
- ): PageNode
+ ): ContentPage
+}
+
+abstract class RootPageNode: PageNode {
+ val parentMap: Map<PageNode, PageNode> by lazy {
+ IdentityHashMap<PageNode, PageNode>().apply {
+ fun process(parent: PageNode) {
+ parent.children.forEach { child ->
+ put(child, parent)
+ process(child)
+ }
+ }
+ process(this@RootPageNode)
+ }
+ }
+
+ fun transformPageNodeTree(operation: (PageNode) -> PageNode) =
+ this.transformNode(operation) as RootPageNode
+
+ fun transformContentPagesTree(operation: (ContentPage) -> ContentPage) = transformPageNodeTree {
+ if (it is ContentPage) operation(it) else it
+ } as RootPageNode
+
+ private fun PageNode.transformNode(operation: (PageNode) -> PageNode): PageNode =
+ operation(this).let { newNode ->
+ newNode.modified(children = newNode.children.map { it.transformNode(operation) })
+ }
+
+ abstract override fun modified(
+ name: String,
+ children: List<PageNode>
+ ): RootPageNode
}
class ModulePageNode(
@@ -28,9 +67,12 @@ class ModulePageNode(
override val documentable: Documentable?,
override val children: List<PageNode>,
override val embeddedResources: List<String> = listOf()
-) : PageNode {
+) : RootPageNode(), ContentPage {
override val dri: DRI = DRI.topLevel
+ override fun modified(name: String, children: List<PageNode>): ModulePageNode =
+ modified(name = name, content = this.content, children = children)
+
override fun modified(
name: String,
content: ContentNode,
@@ -39,26 +81,6 @@ class ModulePageNode(
): ModulePageNode =
if (name == this.name && content === this.content && embeddedResources === this.embeddedResources && children shallowEq this.children) this
else ModulePageNode(name, content, documentable, children, embeddedResources)
-
- private fun PageNode.transformNode(operation: (PageNode) -> PageNode): PageNode =
- operation(this).let { newNode ->
- newNode.modified(children = newNode.children.map { it.transformNode(operation) })
- }
-
- fun transformPageNodeTree(operation: (PageNode) -> PageNode) =
- this.transformNode(operation) as ModulePageNode
-
- val parentMap: IdentityHashMap<PageNode, PageNode> by lazy {
- IdentityHashMap<PageNode, PageNode>().apply {
- fun addParent(parent: PageNode) {
- parent.children.forEach { child ->
- put(child, parent)
- addParent(child)
- }
- }
- addParent(this@ModulePageNode)
- }
- }
}
class PackagePageNode(
@@ -69,7 +91,9 @@ class PackagePageNode(
override val documentable: Documentable?,
override val children: List<PageNode>,
override val embeddedResources: List<String> = listOf()
-) : PageNode {
+) : ContentPage {
+ override fun modified(name: String, children: List<PageNode>): PackagePageNode =
+ modified(name = name, content = this.content, children = children)
override fun modified(
name: String,
@@ -88,7 +112,9 @@ class ClassPageNode(
override val documentable: Documentable?,
override val children: List<PageNode>,
override val embeddedResources: List<String> = listOf()
-) : PageNode {
+) : ContentPage {
+ override fun modified(name: String, children: List<PageNode>): ClassPageNode =
+ modified(name = name, content = this.content, children = children)
override fun modified(
name: String,
@@ -107,7 +133,9 @@ class MemberPageNode(
override val documentable: Documentable?,
override val children: List<PageNode> = emptyList(),
override val embeddedResources: List<String> = listOf()
-) : PageNode {
+) : ContentPage {
+ override fun modified(name: String, children: List<PageNode>): MemberPageNode =
+ modified(name = name, content = this.content, children = children)
override fun modified(
name: String,
@@ -129,10 +157,12 @@ fun PageNode.dfs(predicate: (PageNode) -> Boolean): PageNode? = if (predicate(th
this.children.asSequence().mapNotNull { it.dfs(predicate) }.firstOrNull()
}
-private infix fun <T> List<T>.shallowEq(other: List<T>) =
- this === other || (this.size == other.size && (this zip other).all { (a, b) -> a === b })
+fun PageNode.asSequence(): Sequence<PageNode> = sequence {
+ yield(this@asSequence)
+ children.asSequence().flatMap { it.asSequence() }.forEach { yield(it) }
+}
-// Navigation??
+inline fun <reified T: PageNode> PageNode.children() = children.filterIsInstance<T>()
-// content modifier?
-//data class ContentLink(val link: String): ContentNode \ No newline at end of file
+private infix fun <T> List<T>.shallowEq(other: List<T>) =
+ this === other || (this.size == other.size && (this zip other).all { (a, b) -> a === b })