Revoke ability to multiple loading the same module
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
package io.smnp.ext
|
package io.smnp.ext
|
||||||
|
|
||||||
interface ModuleRegistry {
|
interface ModuleRegistry {
|
||||||
fun requestModulesForPath(path: String): ModuleProvider?
|
fun requestModuleProviderForPath(path: String): ModuleProvider?
|
||||||
fun registeredModules(): List<String>
|
fun registeredModules(): List<String>
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ package io.smnp.environment
|
|||||||
import io.smnp.callable.function.Function
|
import io.smnp.callable.function.Function
|
||||||
import io.smnp.callable.method.Method
|
import io.smnp.callable.method.Method
|
||||||
import io.smnp.callable.signature.ActualSignatureFormatter.format
|
import io.smnp.callable.signature.ActualSignatureFormatter.format
|
||||||
import io.smnp.ext.DefaultModuleRegistry.requestModulesForPath
|
import io.smnp.ext.DefaultModuleRegistry.requestModuleProviderForPath
|
||||||
import io.smnp.ext.ModuleProvider
|
import io.smnp.ext.ModuleProvider
|
||||||
import io.smnp.interpreter.LanguageModuleInterpreter
|
import io.smnp.interpreter.LanguageModuleInterpreter
|
||||||
import io.smnp.runtime.model.CallStack
|
import io.smnp.runtime.model.CallStack
|
||||||
@@ -19,23 +19,24 @@ class DefaultEnvironment(private val rootModule: Module = Module.create("<root>"
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun loadModule(path: String) {
|
override fun loadModule(path: String) {
|
||||||
requestModulesForPath(path).let {
|
requestModuleProviderForPath(path).let {
|
||||||
loadModule(it)
|
loadModule(it)
|
||||||
loadDependencies(it)
|
loadDependencies(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadModule(moduleProvider: ModuleProvider) {
|
private fun loadModule(moduleProvider: ModuleProvider, consumer: (ModuleProvider) -> Unit = {}) {
|
||||||
rootModule.addSubmodule(moduleProvider.provideModule(LanguageModuleInterpreter()))
|
if (!loadedModules.contains(moduleProvider.path)) {
|
||||||
loadedModules.add(moduleProvider.path)
|
rootModule.addSubmodule(moduleProvider.provideModule(LanguageModuleInterpreter()))
|
||||||
|
loadedModules.add(moduleProvider.path)
|
||||||
|
consumer(moduleProvider)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadDependencies(moduleProvider: ModuleProvider) {
|
private fun loadDependencies(moduleProvider: ModuleProvider) {
|
||||||
moduleProvider.dependencies().forEach { dependencyPath ->
|
moduleProvider.dependencies().forEach { dependency ->
|
||||||
if (!loadedModules.contains(dependencyPath)) {
|
loadModule(requestModuleProviderForPath(dependency)) {
|
||||||
val dependency = requestModulesForPath(dependencyPath)
|
loadDependencies(it)
|
||||||
loadModule(dependency)
|
|
||||||
loadDependencies(dependency)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ object DefaultModuleRegistry : ModuleRegistry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun requestModulesForPath(path: String): ModuleProvider {
|
override fun requestModuleProviderForPath(path: String): ModuleProvider {
|
||||||
return modules[path] ?: throw RuntimeException("Module $path not found")
|
return modules[path] ?: throw RuntimeException("Module $path not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user