Class: Sass::Util::SubsetMap

Inherits:
Object
  • Object
show all
Defined in:
lib/sass/util/subset_map.rb

Overview

A map from sets to values. A value is set by providing a set (the "set-set") and a value, which is then recorded as corresponding to that set. Values are accessed by providing a set (the "get-set") and returning all values that correspond to set-sets that are subsets of the get-set.

SubsetMap preserves the order of values as they're inserted.

Examples:

ssm = SubsetMap.new
ssm[Set[1, 2]] = "Foo"
ssm[Set[2, 3]] = "Bar"
ssm[Set[1, 2, 3]] = "Baz"

ssm[Set[1, 2, 3]] #=> ["Foo", "Bar", "Baz"]

Instance Method Summary collapse

Constructor Details

#initializeSubsetMap

Creates a new, empty SubsetMap.



23
24
25
26
# File 'lib/sass/util/subset_map.rb', line 23

def initialize
  @hash = {}
  @vals = []
end

Instance Method Details

#[](set) ⇒ Array

Same as #get, but doesn't return the subsets of the argument for which values were found.

See Also:



96
97
98
# File 'lib/sass/util/subset_map.rb', line 96

def [](set)
  get(set).map {|v, _| v}
end

#[]=(set, value)

Associates a value with a set. When set or any of its supersets is accessed, value will be among the values returned.

Note that if the same set is passed to this method multiple times, all given values will be associated with that set.

This runs in O(n) time, where n is the size of set.

Raises:

  • (ArgumentError)

    If set is empty.



47
48
49
50
51
52
53
54
55
56
# File 'lib/sass/util/subset_map.rb', line 47

def []=(set, value)
  raise ArgumentError.new("SubsetMap keys may not be empty.") if set.empty?

  index = @vals.size
  @vals << value
  set.each do |k|
    @hash[k] ||= []
    @hash[k] << [set, set.to_set, index]
  end
end

#each_value {|Object| ... }

Iterates over each value in the subset map. Ignores keys completely. If multiple keys have the same value, this will return them multiple times.

Yields:

  • (Object)

    Each value in the map.



104
105
106
# File 'lib/sass/util/subset_map.rb', line 104

def each_value
  @vals.each {|v| yield v}
end

#empty?Boolean

Whether or not this SubsetMap has any key-value pairs.



31
32
33
# File 'lib/sass/util/subset_map.rb', line 31

def empty?
  @hash.empty?
end

#get(set) ⇒ Array<(Object, #to_set)>

Returns all values associated with subsets of set.

In the worst case, this runs in O(m*max(n, log m)) time, where n is the size of set and m is the number of associations in the map. However, unless many keys in the map overlap with set, m will typically be much smaller.

See Also:



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/sass/util/subset_map.rb', line 73

def get(set)
  res = set.map do |k|
    subsets = @hash[k]
    next unless subsets
    subsets.map do |subenum, subset, index|
      next unless subset.subset?(set)
      [index, subenum]
    end
  end.flatten(1)
  res.compact!
  res.uniq!
  res.sort!
  res.map! {|i, s| [@vals[i], s]}
  res
end