Sha256: ebaa587bb473a4b65b1ce15c7cedc9fcab402e9be713470591423d2a939d04b7
Contents?: true
Size: 1.65 KB
Versions: 1
Compression:
Stored size: 1.65 KB
Contents
module Steep module AST module Types class Intersection attr_reader :types attr_reader :location def initialize(types:, location: nil) @types = types @location = location end def self.build(types:, location: nil) types.flat_map do |type| if type.is_a?(Intersection) type.types else [type] end end.map do |type| case type when AST::Types::Any return AST::Types::Any.new() when AST::Types::Bot return AST::Types::Bot.new() when AST::Types::Top nil else type end end.compact.uniq.yield_self do |tys| if tys.size == 1 tys.first else new(types: tys.sort_by(&:hash), location: location) end end end def ==(other) other.is_a?(Intersection) && other.types == types end def hash self.class.hash ^ types.hash end alias eql? == def subst(s) self.class.build(location: location, types: types.map {|ty| ty.subst(s) }) end def to_s "(#{types.map(&:to_s).sort.join(" & ")})" end def free_variables types.each.with_object(Set.new) do |type, set| set.merge(type.free_variables) end end include Helper::ChildrenLevel def level [0] + level_of_children(types) end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
steep-0.1.0 | lib/steep/ast/types/intersection.rb |