All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mb.pie.runtime.exec.BottomUpShared.kt Maven / Gradle / Ivy

The newest version!
package mb.pie.runtime.exec

import mb.pie.api.*
import mb.pie.api.exec.ExecReason
import java.util.*

/**
 * Returns keys of tasks that are directly affected by changed resources.
 */
fun StoreReadTxn.directlyAffectedTaskKeys(changedResources: Collection, resourceSystems: ResourceSystems, logger: Logger): HashSet {
  val affected = HashSet()
  for(changedResource in changedResources) {
    logger.trace("* resource: $changedResource")

    val requirees = requireesOf(changedResource)
    for(key in requirees) {
      logger.trace("  * required by: ${key.toShortString(200)}")
      if(!resourceRequires(key).filter { it.key == changedResource }.all { it.isConsistent(resourceSystems) }) {
        affected.add(key)
      }
    }

    val provider = providerOf(changedResource)
    if(provider != null) {
      logger.trace("  * provided by: ${provider.toShortString(200)}")
      if(!resourceProvides(provider).filter { it.key == changedResource }.all { it.isConsistent(resourceSystems) }) {
        affected.add(provider)
      }
    }
  }

  return affected
}

/**
 * Checks whether [caller] has a transitive (or direct) task requirement to [callee].
 */
fun StoreReadTxn.hasTransitiveTaskReq(caller: TaskKey, callee: TaskKey): Boolean {
  // TODO: more efficient implementation for figuring out if an app transitively calls on another app?
  val toCheckQueue: Queue = LinkedList()
  toCheckQueue.add(caller)
  while(!toCheckQueue.isEmpty()) {
    val toCheck = toCheckQueue.poll()
    val taskReqs = taskRequires(toCheck);
    if(taskReqs.any { it.calleeEqual(callee) }) {
      return true
    }
    toCheckQueue.addAll(taskReqs.map { it.callee })
  }
  return false
}

/**
 * [Execution reason][ExecReason] for when a task is (directly or indirectly) affected by a change.
 */
class AffectedExecReason : ExecReason {
  override fun toString() = "directly or indirectly affected by change"

  override fun equals(other: Any?): Boolean {
    if(this === other) return true
    if(other?.javaClass != javaClass) return false
    return true
  }

  override fun hashCode(): Int {
    return 0
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy