Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
require 'pic' def count(lines) lines.inject(Hash.new(0)) do |counts, line| if line =~ %r{GET /ongoing/When/\d\d\dx/(\d\d\d\d/\d\d/\d\d/[^ .]+) } counts[$1] += 1 end counts end end def split(collector, limit, source, lines = [], sets = 0) if lines.size >= limit spawn { collector.send :result, count(lines) } tail { split(collector, limit, source, [], sets + 1) } elsif source.eof? spawn { collector.send :result, count(lines) } collector.send :expecting, sets + 1 else tail { split(collector, limit, source, lines + [source.readline], sets) } end end def collect(counts = {}, sets = 0, expecting = nil) if expecting == sets report counts else receive do |match| match.when :result do |_, result| counts = result.keys.inject(counts) { |h,k| h.merge!(k=>(h[k] || 0) + result[k]) } tail { collect(counts, sets + 1, expecting) } end match.when :expecting do |_, expecting| tail { collect(counts, sets, expecting) } end end end end def report(counts) puts "Results are in" keys = counts.keys.sort { |a, b| counts[b] <=> counts[a] } keys[0 .. 9].each do |key| puts "#{counts[key]}: #{key}" end end collector = spawn { collect } spawn { split(collector, 10000, ARGF) }
This paste will be private.
From the Design Piracy series on my blog: