Sha256: fb4a8df66dfbe0a4199cb5bb4a47c0214a3ba12c44d29db6a4f7f37dbb41ca0e

Contents?: true

Size: 1.75 KB

Versions: 2

Compression:

Stored size: 1.75 KB

Contents

class Hash
  class Sorted

    extend Forwardable
    include Enumerable
    include DeepFreezable

    def_delegators :@hash, :[], :[]=, :value?, :fetch, :values_at,
                           :key?, :include?, :empty?,
                           :delete, :delete_if, :clear, 
                           :merge, :merge!, :update, :store, :replace,
                           :count, :size, :length,
                           :==, :eql, :hash
    
    def_delegators :to_h, :to_a, :to_s, :inspect, 
                          :select, :reject, :flatten,
                          :as_json, :to_json

    def initialize(hash={}, direction=:asc, &sort_criteria)
      @hash = hash
      @direction = direction
      @sort_criteria = sort_criteria
    end

    def keys
      sorted_keys = @hash.sort_by(&sort_criteria).map { |k,v| k }
      direction == :asc ? sorted_keys : sorted_keys.reverse
    end

    def values
      keys.map { |k| self[k] }
    end

    def each
      return enum_for(:each) unless block_given?
      keys.each { |k| yield k, self[k]}
    end
    alias_method :each_pair, :each

    def each_key
      return enum_for(:each_key) unless block_given?
      keys.each { |k| yield k }
    end

    def each_value
      return enum_for(:each_value) unless block_given?
      keys.each { |k| yield self[k] }
    end

    def to_h
      each_with_object({}) { |(k,v),h| h[k] = v }
    end

    private

    attr_reader :direction, :sort_criteria

    class << self
    
      def ascending(hash={}, &sort_criteria)
        new hash, :asc, &sort_criteria
      end
      alias_method :asc, :ascending

      def descending(hash={}, &sort_criteria)
        new hash, :desc, &sort_criteria
      end
      alias_method :desc, :descending

      private :new

    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
hash_ext-0.6.0 lib/hash_ext/sorted.rb
hash_ext-0.5.0 lib/hash_ext/sorted.rb