Skip to content

Instantly share code, notes, and snippets.

@bachue
Last active December 17, 2015 06:39
Show Gist options
  • Save bachue/5567312 to your computer and use it in GitHub Desktop.
Save bachue/5567312 to your computer and use it in GitHub Desktop.
def run_filters(&blk)
m = Module.new do
extend self
@__filter_endpoint = blk
end
code = '@__filter_endpoint.call'
filter_methods = private_methods.grep(/^filter_/)
filter_methods.each do |meth|
m.send(:define_method, "__filter_#{meth}", method(meth))
end
filter_methods.each do |method|
code = "send('#{method}') { #{code} } "
end
m.module_eval code.tap {|c| puts c}
end
def filter_1
puts 1
yield
puts 1
end
def filter_2
puts 2
yield
puts 2
end
def filter_3
puts 3
yield
puts 3
end
run_filters do
puts 'core'
end
def filter(name, &blk)
@__filters ||= []
@__filters << [name, blk]
end
def run_filters(&blk)
@__filter_endpoint = blk
filter_procs = [proc { @__filter_endpoint.call }]
@__filters.each do |name, block|
last = filter_procs.last
filter_procs << proc { block.call last }
end
filter_procs.last.call
end
filter '1' do |app|
puts 1
app.call
puts 1
end
filter '2' do |app|
puts 2
app.call
puts 2
end
filter '3' do |app|
puts 3
app.call
puts 3
end
run_filters do
puts 'core'
end
@filters = []
def filter name, &p
@filters << p
end
def run name, &p
filters = @filters.map{|f| Fiber.new(&f) }
filters.each &:resume
yield
filters.reverse_each &:resume
end
filter '1' do
puts '1('
Fiber.yield
puts ')1'
end
filter '2' do
puts '2('
Fiber.yield
puts ')2'
end
run '3' do
puts '3()3'
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment