Class: Protocol::Media::Set
- Inherits:
-
Object
- Object
- Protocol::Media::Set
- 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
-
.build ⇒ Object
Construct an immutable set using a builder.
-
.for(media_ranges) ⇒ Object
Convert a sequence of ranges into a media set.
Instance Method Summary collapse
-
#each ⇒ Object
Enumerate the canonical media ranges which define membership.
-
#empty? ⇒ Boolean
Whether the set contains no media ranges.
-
#freeze ⇒ Object
Freeze the media set and its index.
-
#include?(media_range) ⇒ Boolean
(also: #===, #match?)
Whether the set contains a compatible media type or range.
-
#initialize(types) ⇒ Set
constructor
Initialize a new media set with the given type index.
-
#size ⇒ Object
The number of canonical membership ranges.
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
.build ⇒ Object
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
#each ⇒ Object
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.
235 236 237 |
# File 'lib/protocol/media/set.rb', line 235 def empty? return @types.empty? end |
#freeze ⇒ Object
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.
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 |
#size ⇒ Object
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 |