==(other)
click to toggle source
def ==(other)
other.is_a?(Record) && other.fields == fields
end
each_type(&block)
click to toggle source
def each_type(&block)
if block
fields.each_value(&block)
else
enum_for :each_type
end
end
eql?(other)
click to toggle source
free_variables(set = Set.new)
click to toggle source
def free_variables(set = Set.new)
set.tap do
fields.each_value do |type|
type.free_variables set
end
end
end
hash()
click to toggle source
def hash
self.class.hash ^ fields.hash
end
map_type_name(&block)
click to toggle source
def map_type_name(&block)
Record.new(
fields: fields.transform_values {|ty| ty.map_type_name(&block) },
location: location
)
end
sub(s)
click to toggle source
def sub(s)
self.class.new(fields: fields.transform_values {|ty| ty.sub(s) },
location: location)
end
to_json(*a)
click to toggle source
def to_json(*a)
{ class: :record, fields: fields, location: location }.to_json(*a)
end
to_s(level = 0)
click to toggle source
def to_s(level = 0)
return "{ }" if self.fields.empty?
fields = self.fields.map do |key, type|
if key.is_a?(Symbol) && key.match?(/\A[A-Za-z_][A-Za-z_]*\z/) && !key.match?(Parser::KEYWORDS_RE)
"#{key}: #{type}"
else
"#{key.inspect} => #{type}"
end
end
"{ #{fields.join(", ")} }"
end