# Enumeration
def enum(start, count)
  (start...(start+count)).to_a
end

module Responder
  # Generates identifiers as class constants. Originally submitted by
  # Sean O'Halpin, slightly modified by Lyle.
  def identifier(*ids)
    ids << :ID_LAST
    base = self.class.superclass::ID_LAST
    vals = enum(base, ids.size)
    ids.each_index do |i|
      unless self.class.const_defined?(ids[i])
        self.class.class_eval("#{ids[i].id2name} = #{vals[i]}")
      end
    end
  end

  # Look up array index of this message map entry
  def assocIndex(lo, hi)
    currIndex = -1
    if @assocs
      @assocs.each_index { |i|
        if @assocs[i][0] == lo && @assocs[i][1] == hi
          currIndex = i
        end
      }
    end
    currIndex
  end

  # Add new or replace existing map entry
  def addMapEntry(lo, hi, func)
    currIndex = assocIndex(lo, hi)
    if @assocs == nil
      @assocs = []
    end
    if currIndex < 0
      @assocs.push([lo, hi, func])
    else
      @assocs[currIndex] = [lo, hi, func]
    end
  end

  # Define range of function types
  def FXMAPTYPES(typelo, typehi, func)
    addMapEntry(MKUINT(MINKEY, typelo), MKUINT(MAXKEY, typehi), func)
  end

  # Define one function type
  def FXMAPTYPE(type, func)
    addMapEntry(MKUINT(MINKEY, type), MKUINT(MAXKEY, type), func)
  end

  # Define range of functions
  def FXMAPFUNCS(type, keylo, keyhi, func)
    addMapEntry(MKUINT(keylo, type), MKUINT(keyhi, type), func)
  end

  # Define one function
  def FXMAPFUNC(type, id, func)
    addMapEntry(MKUINT(id, type), MKUINT(id, type), func)
  end
end
