Skip to content

Instantly share code, notes, and snippets.

@patorash
Created February 14, 2022 10:48
Show Gist options
  • Save patorash/7208b501923d63649922f4775dbefaa5 to your computer and use it in GitHub Desktop.
Save patorash/7208b501923d63649922f4775dbefaa5 to your computer and use it in GitHub Desktop.
HashとArrayで再帰的にソートしたかったのだが、複雑なkeyやvalueのケースは考慮したくなかったのでgemにするのは諦めたやつ。Refinementsを使ってコアクラスを汚染しないようにした。
# frozen_string_literal: true
module DeepSort
class Error < StandardError; end
refine Hash do
def deep_sort
keys = self.keys
raise DeepSort::Error, "Invalid Keys(#{keys})" unless keys.all? { |k| k.is_a?(String) || k.is_a?(Symbol) || k.is_a?(Numeric) }
sort.to_h.transform_values { |v| v.respond_to?(:deep_sort) ? v.deep_sort : v }
end
def deep_sort!
replace(deep_sort)
end
end
refine Array do
def deep_sort
case
when all?(Numeric) then sort
when all?(String), all?(Symbol) then map(&:to_s).sort
else
map { |v| v.respond_to?(:deep_sort) ? v.deep_sort : v }.sort_by(&:to_s)
end
end
def deep_sort!
case
when all?(Numeric) then sort!
when all?(String), all?(Symbol) then map!(&:to_s).sort!
else
map! { |v| v.respond_to?(:deep_sort!) ? v.deep_sort! : v }.sort_by!(&:to_s)
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment