buildLeafWindow = 8
)
-func newBuildQueue() *BuildQueue {
- return &BuildQueue{
- queued: make(map[NodeKey]bool),
- running: make(map[NodeKey]bool),
- failed: make(map[NodeKey]bool),
- }
-}
-
// BuildQueue holds the nodes that wait for a model build. A leaf joins it when
// its message is too long to be its own node. A merge joins it when both of its
// children are built and their texts do not fit in one node. So the core never
retry []NodeKey
}
+// BuildMergeHeap holds the merges that can start, by the end of their context.
+type BuildMergeHeap []NodeKey
+
+func newBuildQueue() *BuildQueue {
+ return &BuildQueue{
+ queued: make(map[NodeKey]bool),
+ running: make(map[NodeKey]bool),
+ failed: make(map[NodeKey]bool),
+ }
+}
+
// AddLeaf adds the leaf of message id. The IDs must come in increasing order.
func (q *BuildQueue) AddLeaf(id int) {
q.leaves = append(q.leaves, id)
// Done removes a built node from the queue.
func (q *BuildQueue) Done(key NodeKey) {
delete(q.running, key)
+
if key.level > 0 {
delete(q.queued, key)
+
return
}
// Fail keeps a node in the queue, but it cannot start until Retry.
func (q *BuildQueue) Fail(key NodeKey) {
delete(q.running, key)
+
if key.level > 0 {
q.retry = append(q.retry, key)
return
// Retry lets the failed nodes start again.
func (q *BuildQueue) Retry() {
clear(q.failed)
+
for _, key := range q.retry {
heap.Push(&q.merges, key)
}
return NodeKey{}, false
}
-// BuildMergeHeap holds the merges that can start, by the end of their context.
-type BuildMergeHeap []NodeKey
-
func (h BuildMergeHeap) Len() int {
return len(h)
}