Coverage Summary for Class: DynamicLoader (it.unibo.tuprolog.argumentation.core.runtime.modules)

Class Method, % Branch, % Line, % Instruction, %
DynamicLoader 80% (4/5) 100% (2/2) 87.5% (21/24) 94% (142/151)
DynamicLoader$Companion 100% (1/1) 100% (3/3) 100% (25/25)
Total 83.3% (5/6) 100% (2/2) 88.9% (24/27) 94.9% (167/176)


 package it.unibo.tuprolog.argumentation.core.runtime.modules
 
 import it.unibo.tuprolog.argumentation.core.Arg2pSolver
 import it.unibo.tuprolog.argumentation.core.flags.ArgsFlag
 import it.unibo.tuprolog.argumentation.core.modules.ArgLibrary
 import it.unibo.tuprolog.argumentation.core.modules.ArgLoader
 import it.unibo.tuprolog.argumentation.core.primitives.modules.LoaderReset
 import it.unibo.tuprolog.argumentation.core.primitives.modules.ModuleGoal
 import it.unibo.tuprolog.argumentation.core.primitives.modules.ModuleGoalInBranch
 import it.unibo.tuprolog.core.operators.Operator
 import it.unibo.tuprolog.core.operators.OperatorSet
 import it.unibo.tuprolog.core.operators.Specifier
 import it.unibo.tuprolog.solve.ExecutionContext
 import it.unibo.tuprolog.solve.MutableSolver
 import it.unibo.tuprolog.solve.library.Library
 import it.unibo.tuprolog.solve.primitive.Solve
 import it.unibo.tuprolog.theory.Theory
 
 internal class DynamicLoader(
     solver: Arg2pSolver,
 ) : ArgLibrary,
     ArgLoader {
     /** The modules loaded so far */
     internal val modules = Modules(solver)
 
     // The solvers of the modules, for the engines solving module calls through solve (the arg2p one inlines them)
     private val moduleSolvers = mutableMapOf<String, MutableSolver>()
 
     // The static knowledge base each module solver was last given: loading it again re-indexes all its clauses
     private val loadedKb = mutableMapOf<String, Theory>()
 
     /** The solver of [module], for the engines solving module calls through solve (the arg2p one inlines them) */
     internal fun solverOf(
         request: Solve.Request<ExecutionContext>,
         module: Module,
     ): MutableSolver =
         moduleSolvers
             .getOrPut(module.name) { request.context.createMutableSolver(libraries = module.libraries) }
             .also {
                 val staticKb = request.context.staticKb
                 if (loadedKb[module.name] !== staticKb) {
                     it.loadStaticKb(staticKb)
                     loadedKb[module.name] = staticKb
                 }
             }
 
     /** Forgets the modules loaded so far, and their solvers */
     internal fun reset() {
         modules.clear()
         moduleSolvers.clear()
         loadedKb.clear()
     }
 
     override val alias = "prolog.argumentation.loader"
 
     override val baseContent: Library
         get() =
             listOf(ModuleGoal(this), ModuleGoalInBranch(this), LoaderReset(this)).let {
                 Library.of(
                     alias = this.alias,
                     primitives = it.associateBy { prim -> prim.signature },
                     operators = operators(),
                 )
             }
     override val baseFlags: Iterable<ArgsFlag<*, *>>
         get() = emptyList()
 
     override var theoryOperators = operators()
 
     companion object {
         fun operators() =
             OperatorSet(
                 Operator("::", Specifier.XFX, 700),
                 Operator(":::", Specifier.XFX, 700),
             )
     }
 }