class RBS::Substitution

Attributes

instance_type[RW]
mapping[R]

Public Class Methods

build(variables, types, instance_type: nil) { |t| ... } click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 20
def self.build(variables, types, instance_type: nil, &block)
  unless variables.size == types.size
    raise "Broken substitution: variables=#{variables}, types=#{types}"
  end

  mapping = variables.zip(types).to_h

  self.new.tap do |subst|
    mapping.each do |v, t|
      type = block_given? ? yield(t) : t
      subst.add(from: v, to: type)
    end

    subst.instance_type = instance_type
  end
end
new() click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 12
def initialize()
  @mapping = {}
end

Public Instance Methods

+(other) click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 66
def +(other)
  return self if other.empty?
  return other if self.empty?

  Substitution.new.tap do |subst|
    subst.mapping.merge!(mapping)

    other.mapping.each do |var, type|
      if mapping.key?(var)
        subst.add(from: var, to: self[type])
      else
        subst.add(from: var, to: type)
      end
    end
  end
end
[](ty)
Alias for: apply
add(from:, to:) click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 16
def add(from:, to:)
  mapping[from] = to
end
apply(ty) click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 37
def apply(ty)
  case ty
  when Types::Variable
    # @type var ty: Types::Variable
    mapping[ty.name] || ty
  when Types::Bases::Instance
    if t = instance_type
      t
    else
      ty
    end
  else
    ty
  end
end
Also aliased as: []
empty?() click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 8
def empty?
  mapping.empty? && instance_type.nil?
end
without(*vars) click to toggle source
# File rbs-3.2.1/lib/rbs/substitution.rb, line 55
def without(*vars)
  Substitution.new.tap do |subst|
    subst.mapping.merge!(mapping)
    vars.each do |var|
      subst.mapping.delete(var)
    end

    subst.instance_type = self.instance_type
  end
end