Skip to content

Instantly share code, notes, and snippets.

@jamesmacaulay
Last active August 29, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamesmacaulay/bb607a6b5eefdfc15f1a to your computer and use it in GitHub Desktop.
Save jamesmacaulay/bb607a6b5eefdfc15f1a to your computer and use it in GitHub Desktop.
module AttributeReaders
class <<self
# str = "foo"
# overrides = {
# another_reverse: :reverse,
# exclaimed: ->(str) { str + "!" },
# to_sym: ->(str) { str.reverse.to_sym }
# }
# reader = AttributeReaders.object_reader(str, overrides)
# [:reverse, :another_reverse, :exclaimed, :to_sym].map(&reader)
# => ["oof", "oof", "foo!", :oof]
def object_reader(object, overrides=nil)
->(key) { (overrides && overrides[key] || key).to_proc.(object) }
end
# user = {id: 99, name: "James"}
# overrides = {
# another_id: :id,
# name: ->(user) { user[:name].upcase }
# }
# reader = AttributeReaders.hash_reader(user, overrides)
# [:id, :another_id, :name, :not_a_key].map(&reader)
# => [99, 99, "JAMES", nil]
def hash_reader(hash, overrides=nil)
->(key) { hash_proc_from(overrides && overrides[key] || key).(hash) }
end
private
def hash_proc_from(x)
x.is_a?(Proc) ? x : ->(hash) { hash[x] }
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment