Sha256: 9b4fe6da7ef9e3436233363c0a739fb373ecbd6c6a65a2dfb527aa3ad465dfd9

Contents?: true

Size: 1.85 KB

Versions: 5

Compression:

Stored size: 1.85 KB

Contents

require 'forwardable'

class Thor #:nodoc:
  module CoreExt #:nodoc:

    # 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.
    #
    class OrderedHash #:nodoc:
      include Enumerable

      Node = Struct.new(:key, :value, :next, :prev)

      def initialize
        @hash = {}
      end

      def [](key)
        @hash[key] && @hash[key].value
      end

      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

      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

      def keys
        self.map { |k, v| k }
      end

      def values
        self.map { |k, v| v }
      end

      def each
        return unless @first
        yield [@first.key, @first.value]
        node = @first
        yield [node.key, node.value] while node = node.next
        self
      end

      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

      def empty?
        @hash.empty?
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
josevalim-thor-0.10.19 lib/thor/core_ext/ordered_hash.rb
josevalim-thor-0.10.20 lib/thor/core_ext/ordered_hash.rb
josevalim-thor-0.10.21 lib/thor/core_ext/ordered_hash.rb
josevalim-thor-0.10.22 lib/thor/core_ext/ordered_hash.rb
josevalim-thor-0.10.23 lib/thor/core_ext/ordered_hash.rb