class Array_groupings

Public Class Methods

new(args) click to toggle source
# File lib/array_groupings.rb, line 2
def initialize(args)
  @args = args
  @arr = @args[:arr].to_enum
  @debug = @args[:debug]
end

Public Instance Methods

parse() { |last, ele| ... } click to toggle source
# File lib/array_groupings.rb, line 8
def parse
  return Enumerator.new do |yielder|
    prev_ele = @arr.next
    chunk = [prev_ele]
    chunks = [chunk]
    print "First ele: #{prev_ele}\n" if @debug
    
    begin
      while ele = @arr.next
        print "Ele: '#{ele}'\n" if @debug
        deletes = []
        adds = []
        
        chunks.each do |chunk_i|
          res_last = yield(chunk_i.last, ele)
          res_first = yield(chunk_i.first, ele)
          
          if res_first and res_last
            chunk_i << ele
          elsif !res_last and !res_first
            yielder << chunk_i
            deletes << chunk_i
            adds << [ele]
          elsif res_last and !res_first
            new_add = []
            chunk_i.each do |chunk_i_ele|
              if yield(chunk_i_ele, ele)
                new_add << chunk_i_ele
              end
            end
            new_add << ele
            
            yielder << chunk_i
            adds << new_add
            deletes << chunk_i
          else
            raise "Dont know what to do here. First: #{chunk_i.first}, last: #{chunk_i.last}, ele: #{ele}, res_last: #{res_last}, res_first: #{res_first}"
          end
        end
        
        chunks -= deletes
        chunks += adds
      end
    rescue StopIteration
      chunks.each do |chunk|
        yielder << chunk
      end
    end
  end
end