
org.jetbrains.kotlinx.jupyter.codegen.TextRenderersProcessorImpl.kt Maven / Gradle / Ivy
package org.jetbrains.kotlinx.jupyter.codegen
import org.jetbrains.kotlinx.jupyter.api.TextRenderer
import org.jetbrains.kotlinx.jupyter.api.TextRendererWithPriority
import org.jetbrains.kotlinx.jupyter.exceptions.LibraryProblemPart
import org.jetbrains.kotlinx.jupyter.exceptions.rethrowAsLibraryException
import org.jetbrains.kotlinx.jupyter.util.PriorityList
class TextRenderersProcessorImpl : TextRenderersProcessorWithPreventingRecursion {
private val renderers = PriorityList()
private val cache = mutableListOf()
override fun register(renderer: TextRenderer, priority: Int) {
renderers.add(renderer, priority)
}
override fun unregister(renderer: TextRenderer) {
renderers.remove(renderer)
}
override fun registeredRenderers(): List {
return renderers.elementsWithPriority().map { TextRendererWithPriority(it.first, it.second) }
}
override fun render(value: Any?): String {
val cacheIndex = cache.indexOfFirst { it.k === value }
if (cacheIndex != -1) {
return cache[cacheIndex].v ?: ""
}
cache.add(CacheEntry(value))
val cacheEntry = cache.last()
fun cached(rendered: String): String {
cacheEntry.v = rendered
return rendered
}
for (renderer in renderers) {
val res = rethrowAsLibraryException(LibraryProblemPart.TEXT_RENDERERS) {
renderer.render(this, value)
}
if (res != null) return cached(res)
}
return cached(value.toString())
}
override fun renderPreventingRecursion(value: Any?): String {
val res = try {
cache.clear()
render(value)
} finally {
cache.clear()
}
return res
}
private data class CacheEntry(
var k: Any?,
var v: String? = null,
)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy