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

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

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

import mb.pie.api.Store
import mb.pie.api.TaskKey
import java.util.*

class DistinctTaskKeyPriorityQueue(comparator: Comparator) {
  private val queue = PriorityQueue(comparator)
  private val set = hashSetOf()

  companion object {
    fun withTransitiveDependencyComparator(store: Store) = DistinctTaskKeyPriorityQueue(DependencyComparator(store))
  }

  fun isNotEmpty(): Boolean {
    return queue.isNotEmpty()
  }

  fun contains(key: TaskKey): Boolean {
    return set.contains(key)
  }

  fun poll(): TaskKey {
    val key = queue.remove()
    set.remove(key)
    return key
  }

  fun pollLeastTaskWithDepTo(key: TaskKey, store: Store): TaskKey? {
    val queueCopy = PriorityQueue(queue)
    while(queueCopy.isNotEmpty()) {
      val queuedKey = queueCopy.poll()
      if(queuedKey == key || store.readTxn().use { txn -> txn.hasTransitiveTaskReq(key, queuedKey) }) {
        queue.remove(queuedKey)
        set.remove(queuedKey)
        return queuedKey
      }
    }
    return null
  }

  fun add(key: TaskKey) {
    if(set.contains(key)) return
    queue.add(key)
    set.add(key)
  }

  override fun toString() = queue.toString()
}

class DependencyComparator(private val store: Store) : Comparator {
  override fun compare(key1: TaskKey, key2: TaskKey): Int {
    return when {
      key1 == key2 -> 0
      store.readTxn().use { txn -> txn.hasTransitiveTaskReq(key1, key2) } -> 1
      else -> -1
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy