class IDL::Engine::ProductionStack

def [](id)

def [](id)
  @stack[@index[id.to_sym]].last
end

def empty?

def empty?
  @stack.empty?
end

def has?(id)

def has?(id)
  @index.has_key?(id.to_sym)
end

def initialize

def initialize
  @stack = []
  @index = {}
end

def peek

def peek
  return nil if empty?
  id, _ = @stack.first
  id
end

def pop

def pop
  return nil if empty?
  id, prod = @stack.shift
  @index.delete(id)
  prod
end

def push(id, prod)

def push(id, prod)
  @index[id.to_sym] = @stack.size
  @stack << [id.to_sym, prod]
end

def remove(id)

def remove(id)
  return nil unless has?(id)
  i = @index.delete(id.to_sym)
  _, producer = @productionstack.delete(i)
  producer
end

def size

def size
  @stack.size
end