diff options
Diffstat (limited to 'core/src/main/kotlin/pages/PageNodes.kt')
| -rw-r--r-- | core/src/main/kotlin/pages/PageNodes.kt | 92 | 
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 }) | 
