class Redis::SubscribedClient

def call(command)

def call(command)
  @client.process([command])
end

def initialize(client)

def initialize(client)
  @client = client
end

def psubscribe(*channels, &block)

def psubscribe(*channels, &block)
  subscription("psubscribe", "punsubscribe", channels, block)
end

def psubscribe_with_timeout(timeout, *channels, &block)

def psubscribe_with_timeout(timeout, *channels, &block)
  subscription("psubscribe", "punsubscribe", channels, block, timeout)
end

def punsubscribe(*channels)

def punsubscribe(*channels)
  call([:punsubscribe, *channels])
end

def subscribe(*channels, &block)

def subscribe(*channels, &block)
  subscription("subscribe", "unsubscribe", channels, block)
end

def subscribe_with_timeout(timeout, *channels, &block)

def subscribe_with_timeout(timeout, *channels, &block)
  subscription("subscribe", "unsubscribe", channels, block, timeout)
end

def subscription(start, stop, channels, block, timeout = 0)

def subscription(start, stop, channels, block, timeout = 0)
  sub = Subscription.new(&block)
  unsubscribed = false
  begin
    @client.call_loop([start, *channels], timeout) do |line|
      type, *rest = line
      sub.callbacks[type].call(*rest)
      unsubscribed = type == stop && rest.last == 0
      break if unsubscribed
    end
  ensure
    # No need to unsubscribe here. The real client closes the connection
    # whenever an exception is raised (see #ensure_connected).
  end
end

def unsubscribe(*channels)

def unsubscribe(*channels)
  call([:unsubscribe, *channels])
end