Class: Thor::CoreExt::OrderedHash
- Inherits:
-
Hash
- Object
- Hash
- Thor::CoreExt::OrderedHash
- Includes:
- Enumerable
- Defined in:
- lib/thor/core_ext/ordered_hash.rb,
lib/thor/core_ext/ordered_hash.rb
Overview
This class is based on the Ruby 1.9 ordered hashes.
It keeps the semantics and most of the efficiency of normal hashes while also keeping track of the order in which elements were set.
Defined Under Namespace
Classes: Node
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
- #delete(key) ⇒ Object
- #each {|[@first.key, @first.value]| ... } ⇒ Object
- #empty? ⇒ Boolean
-
#initialize ⇒ OrderedHash
constructor
A new instance of OrderedHash.
- #keys ⇒ Object
- #merge(other) ⇒ Object
- #values ⇒ Object
Constructor Details
#initialize ⇒ OrderedHash
Returns a new instance of OrderedHash.
18 19 20 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 18 def initialize @hash = {} end |
Instance Method Details
#[](key) ⇒ Object
22 23 24 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 22 def [](key) @hash[key] && @hash[key].value end |
#[]=(key, value) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 26 def []=(key, value) if node = @hash[key] node.value = value else node = Node.new(key, value) if @first.nil? @first = @last = node else node.prev = @last @last.next = node @last = node end end @hash[key] = node value end |
#delete(key) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 45 def delete(key) if node = @hash[key] prev_node = node.prev next_node = node.next next_node.prev = prev_node if next_node prev_node.next = next_node if prev_node @first = next_node if @first == node @last = prev_node if @last == node value = node.value end @hash.delete(key) value end |
#each {|[@first.key, @first.value]| ... } ⇒ Object
71 72 73 74 75 76 77 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 71 def each return unless @first yield [@first.key, @first.value] node = @first yield [node.key, node.value] while node = node.next self end |
#empty? ⇒ Boolean
93 94 95 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 93 def empty? @hash.empty? end |
#keys ⇒ Object
63 64 65 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 63 def keys self.map { |k, v| k } end |
#merge(other) ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 79 def merge(other) hash = self.class.new self.each do |key, value| hash[key] = value end other.each do |key, value| hash[key] = value end hash end |
#values ⇒ Object
67 68 69 |
# File 'lib/thor/core_ext/ordered_hash.rb', line 67 def values self.map { |k, v| v } end |