Class: Protocol::Media::Set

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/protocol/media/set.rb

Overview

An immutable set of compatible media ranges.

Defined Under Namespace

Classes: Builder

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(types) ⇒ Set

Initialize a new media set with the given type index.

The index is retained without copying or freezing it.



155
156
157
# File 'lib/protocol/media/set.rb', line 155

def initialize(types)
	@types = types
end

Class Method Details

.buildObject

Construct an immutable set using a builder.



116
117
118
119
120
121
122
123
124
# File 'lib/protocol/media/set.rb', line 116

def self.build
	builder = Builder.new
	
	if block_given?
		yield builder
	end
	
	return builder.build
end

.for(media_ranges) ⇒ Object

Convert a sequence of ranges into a media set.

Existing sets are returned unchanged, including their frozen state.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/protocol/media/set.rb', line 132

def self.for(media_ranges)
	# Preserve an existing media set:
	if media_ranges.instance_of?(self)
		return media_ranges
	end
	
	# Preserve the universal media set:
	if media_ranges.instance_of?(Any)
		return media_ranges
	end
	
	return build do |builder|
		media_ranges.each do |media_range|
			builder << media_range
		end
	end
end

Instance Method Details

#eachObject

Enumerate the canonical media ranges which define membership.



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/protocol/media/set.rb', line 209

def each
	return to_enum unless block_given?
	
	@types.each do |type, subtypes|
		if subtypes.instance_of?(Any)
			yield Range.new(type, "*")
		else
			subtypes.each do |subtype|
				yield Range.new(type, subtype)
			end
		end
	end
	
	return self
end

#empty?Boolean

Whether the set contains no media ranges.

Returns:

  • (Boolean)


235
236
237
# File 'lib/protocol/media/set.rb', line 235

def empty?
	return @types.empty?
end

#freezeObject

Freeze the media set and its index.



161
162
163
164
165
166
167
168
# File 'lib/protocol/media/set.rb', line 161

def freeze
	return self if frozen?
	
	@types.each_value(&:freeze)
	@types.freeze
	
	return super
end

#include?(media_range) ⇒ Boolean Also known as: ===, match?

Whether the set contains a compatible media type or range.

Returns:

  • (Boolean)


173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/protocol/media/set.rb', line 173

def include?(media_range)
	media_range = normalize(media_range)
	type = media_range.type
	subtype = media_range.subtype
	
	# A wildcard type matches any non-empty set:
	if type == "*"
		return !@types.empty?
	end
	
	subtypes = @types[type]
	
	# An unknown type cannot match:
	unless subtypes
		return false
	end
	
	# A wildcard subtype matches any known type:
	if subtype == "*"
		return true
	end
	
	# A type-wide wildcard matches every subtype:
	if subtypes.instance_of?(Any)
		return true
	end
	
	return subtypes.include?(subtype)
end

#sizeObject

The number of canonical membership ranges.



227
228
229
230
231
# File 'lib/protocol/media/set.rb', line 227

def size
	return @types.sum do |_type, subtypes|
		subtypes.size
	end
end