import * as tsplus_module_1 from "@tsplus/stdlib/collections/Chunk/definition";
import * as tsplus_module_2 from "@tsplus/stdlib/collections/Chunk/isEmpty";
import * as tsplus_module_3 from "@tsplus/stdlib/collections/Chunk/empty";
import * as tsplus_module_4 from "@tsplus/stdlib/collections/Chunk/unsafeHead";
import * as tsplus_module_5 from "@tsplus/stdlib/collections/Chunk/drop";
import * as tsplus_module_6 from "@tsplus/stdlib/collections/Chunk/single";
import { Subscription } from "@effect/core/io/Hub/operations/_internal/Subscription";
export class BoundedHubSingle {
  constructor() {
    this.publisherIndex = 0;
    this.subscriberCount = 0;
    this.subscribers = 0;
    this.value = null;
    this.capacity = 1;
  }

  isEmpty() {
    return this.subscribers === 0;
  }

  isFull() {
    return !this.isEmpty();
  }

  publish(a) {
    if (this.isFull()) {
      return false;
    }

    if (this.subscriberCount !== 0) {
      this.value = a;
      this.subscribers = this.subscriberCount;
      this.publisherIndex += 1;
    }

    return true;
  }

  publishAll(as) {
    const list = tsplus_module_1.from(as);

    if (tsplus_module_2.isEmpty(list)) {
      return tsplus_module_3.empty();
    }

    if (this.publish(tsplus_module_4.unsafeHead(list))) {
      return tsplus_module_5.drop_(list, 1);
    } else {
      return list;
    }
  }

  size() {
    return this.isEmpty() ? 0 : 1;
  }

  slide() {
    if (this.isFull()) {
      this.subscribers = 0;
      this.value = null;
    }
  }

  subscribe() {
    this.subscriberCount += 1;
    return new BoundedHubSingleSubscription(this, this.publisherIndex, false);
  }

}

class BoundedHubSingleSubscription extends Subscription {
  constructor(self, subscriberIndex, unsubscribed) {
    super();
    this.self = self;
    this.subscriberIndex = subscriberIndex;
    this.unsubscribed = unsubscribed;
  }

  isEmpty() {
    return this.unsubscribed || this.self.subscribers === 0 || this.subscriberIndex === this.self.publisherIndex;
  }

  poll(default_) {
    if (this.isEmpty()) {
      return default_;
    }

    const a = this.self.value;
    this.self.subscribers -= 1;

    if (this.self.subscribers === 0) {
      this.self.value = null;
    }

    this.subscriberIndex += 1;
    return a;
  }

  pollUpTo(n) {
    if (this.isEmpty() || n < 1) {
      return tsplus_module_3.empty();
    }

    const a = this.self.value;
    this.self.subscribers -= 1;

    if (this.self.subscribers === 0) {
      this.self.value = null;
    }

    this.subscriberIndex += 1;
    return tsplus_module_6.single(a);
  }

  size() {
    return this.isEmpty() ? 0 : 1;
  }

  unsubscribe() {
    if (!this.unsubscribed) {
      this.unsubscribed = true;
      this.self.subscriberCount -= 1;

      if (this.subscriberIndex !== this.self.publisherIndex) {
        this.self.subscribers -= 1;

        if (this.self.subscribers === 0) {
          this.self.value = null;
        }
      }
    }
  }

}
//# sourceMappingURL=BoundedHubSingle.mjs.map