AUTHOR
jan molic /mig/at/1984/dot/cz/
DESCRIPTION
Hash with preserved order and some array-like extensions Public domain.
THANKS
Andrew Johnson for his suggestions and fixes of Hash[], merge, to_a, inspect and shift
# File lib/nanoc/base/ordered_hash.rb, line 16 def [](*args) hsh = OrderedHash.new if args[0].is_a?(Hash) hsh.replace args[0] elsif args.size.odd? raise ArgumentError, 'odd number of elements for Hash' else 0.step(args.size - 1, 2) do |a| b = a + 1 hsh[args[a]] = args[b] end end hsh end
# File lib/nanoc/base/ordered_hash.rb, line 48 def ==(other) return false if @order != other.order super other end
# File lib/nanoc/base/ordered_hash.rb, line 190 def __class__ OrderedHash end
# File lib/nanoc/base/ordered_hash.rb, line 53 def clear @order = [] super end
# File lib/nanoc/base/ordered_hash.rb, line 58 def delete(key) @order.delete key super end
# File lib/nanoc/base/ordered_hash.rb, line 79 def delete_if @order.clone.each do |k| delete k if yield(k) end self end
# File lib/nanoc/base/ordered_hash.rb, line 73 def each @order.each { |k| yield k, self[k] } self end
# File lib/nanoc/base/ordered_hash.rb, line 63 def each_key @order.each { |k| yield k } self end
# File lib/nanoc/base/ordered_hash.rb, line 68 def each_value @order.each { |k| yield self[k] } self end
# File lib/nanoc/base/ordered_hash.rb, line 223 def each_with_index @order.each_with_index { |k, index| yield k, self[k], index } self end
# File lib/nanoc/base/ordered_hash.rb, line 96 def first { @order.first => self[@order.first] } end
# File lib/nanoc/base/ordered_hash.rb, line 164 def inspect ary = [] each { |k, v| ary << k.inspect + '=>' + v.inspect } '{' + ary.join(', ') + '}' end
# File lib/nanoc/base/ordered_hash.rb, line 104 def invert hsh2 = {} @order.each { |k| hsh2[self[k]] = k } hsh2 end
# File lib/nanoc/base/ordered_hash.rb, line 100 def last { @order.last => self[@order.last] } end
# File lib/nanoc/base/ordered_hash.rb, line 176 def merge(hsh2) dup update(hsh2) end
# File lib/nanoc/base/ordered_hash.rb, line 149 def pop key = @order.last key ? [key, delete(key)] : nil end
# File lib/nanoc/base/ordered_hash.rb, line 139 def push(k, v) if self.include? k false else @order.push k orig_store(k, v) true end end
# File lib/nanoc/base/ordered_hash.rb, line 110 def reject(&block) dup.delete_if(&block) end
# File lib/nanoc/base/ordered_hash.rb, line 114 def reject!(&block) hsh2 = reject(&block) self == hsh2 ? nil : hsh2 end
# File lib/nanoc/base/ordered_hash.rb, line 119 def replace(hsh2) @order = hsh2.keys super hsh2 end
# File lib/nanoc/base/ordered_hash.rb, line 180 def select ary = [] each { |k, v| ary << [k, v] if yield k, v } ary end
# File lib/nanoc/base/ordered_hash.rb, line 124 def shift key = @order.first key ? [key, delete(key)] : super end
# File lib/nanoc/base/ordered_hash.rb, line 42 def store(a, b) @order.push a unless key? a super a, b end
# File lib/nanoc/base/ordered_hash.rb, line 37 def store_only(a, b) store a, b end
# File lib/nanoc/base/ordered_hash.rb, line 154 def to_a ary = [] each { |k, v| ary << [k, v] } ary end
# File lib/nanoc/base/ordered_hash.rb, line 160 def to_s to_a.to_s end
# File lib/nanoc/base/ordered_hash.rb, line 129 def unshift(k, v) if self.include? k false else @order.unshift k orig_store(k, v) true end end
# File lib/nanoc/base/ordered_hash.rb, line 170 def update(hsh2) hsh2.each { |k, v| self[k] = v } self end
# File lib/nanoc/base/ordered_hash.rb, line 86 def values ary = [] @order.each { |k| ary.push self[k] } ary end
# File lib/nanoc/base/ordered_hash.rb, line 219 def yaml_inline! self.yaml_inline = true end
# File lib/nanoc/base/ordered_hash.rb, line 195 def yaml_inline=(bool) if respond_to?('to_yaml_style') self.to_yaml_style = :inline else unless defined? @__yaml_inline_meth @__yaml_inline_meth = lambda do |opts| YAML.quick_emit(object_id, opts) do |emitter| emitter << '{ ' << map { |kv| kv.join ': ' }.join(', ') << ' }' end end class << self def to_yaml(opts = {}) @__yaml_inline ? @__yaml_inline_meth[ opts ] : super rescue @to_yaml_style = :inline super end end end end @__yaml_inline = bool end
Generated with the Darkfish Rdoc Generator 2.