Skip to content

Instantly share code, notes, and snippets.

@Teino1978-Corp
Created February 18, 2016 18:33
Show Gist options
  • Save Teino1978-Corp/7aa8d40d682a41641b69 to your computer and use it in GitHub Desktop.
Save Teino1978-Corp/7aa8d40d682a41641b69 to your computer and use it in GitHub Desktop.
Port of clojure.walk to Ruby
module Walk
refine Array do
def walk(inner_f, outer_f)
outer_f.(self.map(&inner_f))
end
end
refine Hash do
def walk(inner_f, outer_f)
outer_f.(self.map(&inner_f).to_h)
end
end
refine Object do
def walk(_inner_f, outer_f)
outer_f.(self)
end
end
using self
def self.walk(inner_f, outer_f, object)
object.walk(inner_f, outer_f)
end
def self._postwalk(f, object)
g = self.method(:_postwalk).curry.(f)
walk(g, f, object)
end
def self.postwalk(object, &block)
_postwalk(block, object)
end
def self._prewalk(f, object)
g = self.method(:_prewalk).curry.(f)
walk(g, :itself.to_proc, f.(object))
end
def self.prewalk(object, &block)
_prewalk(block, object)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment