class Concurrent::UnbufferedChannel

def initialize

def initialize
  @probe_set = WaitableList.new
end

def pop

def pop
  probe = Channel::Probe.new
  select(probe)
  probe.value
end

def probe_set_size

def probe_set_size
  @probe_set.size
end

def push(value)

def push(value)
  until @probe_set.take.set_unless_assigned(value, self)
  end
end

def remove_probe(probe)

def remove_probe(probe)
  @probe_set.delete(probe)
end

def select(probe)

def select(probe)
  @probe_set.put(probe)
end