Coverage Summary for Class: UniqueByFirst (it.unibo.tuprolog.argumentation.core.primitives.utils)

Class Class, % Method, % Branch, % Line, % Instruction, %
UniqueByFirst 100% (1/1) 100% (2/2) 50% (1/2) 100% (10/10) 97.1% (33/34)


 package it.unibo.tuprolog.argumentation.core.primitives.utils
 
 import it.unibo.tuprolog.core.List
 import it.unibo.tuprolog.core.Substitution
 import it.unibo.tuprolog.core.Term
 import it.unibo.tuprolog.solve.ExecutionContext
 import it.unibo.tuprolog.solve.primitive.BinaryRelation
 import it.unibo.tuprolog.solve.primitive.Solve
 
 /**
  * uniqueByFirst(+Lists, ?Unique): Lists keeping, among the lists with the same first element, only the last one
  * (in their order)
  */
 internal object UniqueByFirst : BinaryRelation.WithoutSideEffects<ExecutionContext>("uniqueByFirst") {
     override fun Solve.Request<ExecutionContext>.computeAllSubstitutions(
         first: Term,
         second: Term,
     ): Sequence<Substitution> {
         if (first !is List) return emptySequence()
         val seen = HashSet<Term>()
         val unique =
             first
                 .toList()
                 .asReversed()
                 .filter { seen.add(it.castToList().toList().first()) }
                 .asReversed()
         return unifyWith(second, List.of(unique))
     }
 }