tamashii-io/tamashii-manager

View on GitHub
lib/tamashii/manager/channel_pool.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Tamashii
  module Manager
    # :nodoc:
    class ChannelPool < Hash
      attr_reader :idles

      def initialize(size = 10)
        @idles = []
        @ptr = 1

        size.times { create! }
      end

      def create!
        channel = Channel.new(@ptr)
        @idles << channel
        @ptr += 1
        channel
      end

      def idle(channel_id = nil)
        return @idles.first if channel_id.nil?
        return unless self[channel_id]&.empty?
        @idles << self[channel_id]
        self[channel_id] = nil
      end

      def ready(channel)
        return if channel.empty?
        self[channel.id] = channel
        @idles.delete(channel) if @idles.include?(channel)
        channel
      end

      def available?
        !@idles.empty?
      end
    end
  end
end