goog.loadModule(function(exports) {
  "use strict";
  goog.module("goog.async.WorkQueue");
  goog.module.declareLegacyNamespace();
  const FreeList = goog.require("goog.async.FreeList");
  const {assert} = goog.require("goog.asserts");
  class WorkQueue {
    constructor() {
      this.workHead_ = null;
      this.workTail_ = null;
    }
    add(fn, scope) {
      const item = this.getUnusedItem_();
      item.set(fn, scope);
      if (this.workTail_) {
        this.workTail_.next = item;
        this.workTail_ = item;
      } else {
        assert(!this.workHead_);
        this.workHead_ = item;
        this.workTail_ = item;
      }
    }
    remove() {
      let item = null;
      if (this.workHead_) {
        item = this.workHead_;
        this.workHead_ = this.workHead_.next;
        if (!this.workHead_) {
          this.workTail_ = null;
        }
        item.next = null;
      }
      return item;
    }
    returnUnused(item) {
      WorkQueue.freelist_.put(item);
    }
    getUnusedItem_() {
      return WorkQueue.freelist_.get();
    }
  }
  WorkQueue.DEFAULT_MAX_UNUSED = goog.define("goog.async.WorkQueue.DEFAULT_MAX_UNUSED", 100);
  WorkQueue.freelist_ = new FreeList(() => {
    return new WorkItem();
  }, item => {
    return item.reset();
  }, WorkQueue.DEFAULT_MAX_UNUSED);
  class WorkItem {
    constructor() {
      this.fn = null;
      this.scope = null;
      this.next = null;
    }
    set(fn, scope) {
      this.fn = fn;
      this.scope = scope;
      this.next = null;
    }
    reset() {
      this.fn = null;
      this.scope = null;
      this.next = null;
    }
  }
  exports = WorkQueue;
  return exports;
});

//# sourceMappingURL=goog.async.workqueue.js.map
