Module: DeepSort::DeepSortHash

Defined in:
lib/deepsort.rb

Overview

inject this method into the Hash class to add deep sort functionality to Hashes Note: this cannot sort a hashes keys in place (deep_sort!), only the values

Instance Method Summary collapse

Instance Method Details

#deep_sortObject



55
56
57
# File 'lib/deepsort.rb', line 55

def deep_sort
  deep_sort_by { |obj| obj }
end

#deep_sort!Object



59
60
61
# File 'lib/deepsort.rb', line 59

def deep_sort!
  deep_sort_by! { |obj| obj }
end

#deep_sort_by(&block) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/deepsort.rb', line 63

def deep_sort_by(&block)
  Hash[self.map do |key, value|
    [if key.respond_to? :deep_sort_by
      key.deep_sort_by &block
    elsif key.respond_to? :sort_by
      key.sort_by &block
    else
      key
    end,

    if value.respond_to? :deep_sort_by
      value.deep_sort_by &block
    elsif value.respond_to? :sort_by
      value.sort_by &block
    else
      value
    end]

  end.sort_by &block]
end

#deep_sort_by!(&block) ⇒ Object

Ruby Hashes don’t have in-place-modification like map!, each!, or sort! that means that this method won’t be able to sort the hash keys in place either. since Hashes are technically non-sorted key value pairs, this shouldn’t be a problem



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/deepsort.rb', line 87

def deep_sort_by!(&block)
  Hash[self.map do |key, value|
    if key.respond_to? :deep_sort_by!
      key.deep_sort_by! &block
    elsif key.respond_to? :sort_by!
      key.sort_by! &block
    end

    if value.respond_to? :deep_sort!
      value.deep_sort_by! &block
    elsif value.respond_to? :sort_by!
      value.sort_by! &block
    end

    [key, value]
  end]
end