Last active
December 17, 2015 06:39
-
-
Save bachue/5567312 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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