module Frappuccino
  class Zip < Stream
    def initialize(left, right)
      @left_buffer = []
      @right_buffer = []
      left.add_observer(self, :left_update)
      right.add_observer(self, :right_update)
    end

    def left_update(event)
      if @right_buffer.length > 0
        occur([event, @right_buffer.shift])
      else
        @left_buffer << event
      end
    end

    def right_update(event)
      if @left_buffer.length > 0
        occur([@left_buffer.shift, event])
      else
        @right_buffer << event
      end
    end
  end
end