class ReeEnum::Values

def add(value, mapped_value, method)

def add(value, mapped_value, method)
  if @value_type.nil?
    @value_type = value.class
  elsif @value_type != value.class
    raise ArgumentError, "#{@klass}: value types should be the same for all enum values"
  end
  if !method.nil? && @collection.any? { _1.method == method }
    raise ArgumentError, "#{@klass}: method #{method.inspect} was already added"
  end
  if @collection_by_value.key?(value)
    raise ArgumentError, "#{@klass}: value #{value.inspect} was already added"
  end
  if @collection_by_mapped_value.key?(mapped_value)
    raise ArgumentError, "#{@klass}: mapped_value(#{mapped_value.inspect}) for #{value.inspect} was already added"
  end
  enum_value = ReeEnum::Value.new(
    @klass, @enum_name, value, mapped_value, method
  )
  @collection << enum_value
  @collection_by_value[value] = enum_value
  @collection_by_mapped_value[mapped_value] = enum_value
  enum_value
end

def by_mapped_value(mapped_value)

def by_mapped_value(mapped_value)
  @collection_by_mapped_value[mapped_value]
end

def by_mapped_value!(mapped_value)

def by_mapped_value!(mapped_value)
  by_mapped_value(mapped_value) ||
    (raise ArgumentError.new("constant for value #{mapped_value.inspect} is not found in #{self.inspect}"))
end

def by_value(value)

def by_value(value)
  value = value.to_s if value.is_a?(Symbol)
  @collection_by_value[value]
end

def by_value!(value)

def by_value!(value)
  by_value(value) ||
    (raise ArgumentError.new("constant for value #{value.inspect} is not found in #{self.inspect}"))
end

def each(&)

def each(&)
  @collection.each(&)
end

def initialize(klass, enum_name)

def initialize(klass, enum_name)
  @klass = klass
  @enum_name = enum_name
  @collection = []
  @collection_by_value = {}
  @collection_by_mapped_value = {}
end

def inspect

def inspect
  @collection.map(&:inspect).inspect
end

def to_a

def to_a
  @collection
end

def value_type

def value_type
  raise ArgumentError, "value_type is not defined" unless defined?(@value_type)
  @value_type
end