Advertisement
funny_falcon

iced ruby try 1

Nov 21st, 2012
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.67 KB | None | 0 0
  1. class Async
  2.   attr :count
  3.   def initialize
  4.     @count = 1
  5.     @fiber = Fiber.current
  6.   end
  7.  
  8.   def inc!
  9.     @count += 1
  10.   end
  11.  
  12.   class Defer
  13.     class DoubleCall < StandardError; end
  14.     def initialize(async, &block)
  15.       @async = async
  16.       @block = block
  17.       @called = false
  18.     end
  19.     def call(*args)
  20.       raise DoubleCall  if @called
  21.       @called = true
  22.       @block.call(*args)
  23.       @async.dec!
  24.     end
  25.     def to_proc
  26.       method(:call).to_proc
  27.     end
  28.   end
  29.  
  30.   def defer(&block)
  31.     inc!
  32.     Defer.new(self, &block)
  33.   end
  34.  
  35.   def _dec!
  36.     @count -= 1
  37.   end
  38.  
  39.   def dec!
  40.     @fiber.resume  if _dec! == 0
  41.   end
  42.   alias call dec!
  43. end
  44.  
  45. def await
  46.   as = Async.new
  47.   yield as
  48.   Fiber.yield if as._dec! > 0
  49. end
  50.  
  51. def once
  52.   res = nil
  53.   await do |as|
  54.     yield as.defer{|r| res = r}
  55.   end
  56.   res
  57. end
  58.  
  59. module Enumerable
  60.   def defer_map
  61.     res = []
  62.     cnt = 0
  63.     await do |a|
  64.       each do |v|
  65.         i = cnt
  66.         cnt += 1
  67.         yield v, a.defer{|r| res[i] = r}
  68.       end
  69.     end
  70.     res
  71.   end
  72. end
  73.  
  74. require 'em-synchrony'
  75.  
  76. class Conn
  77.   def by_pk_cb(i, cb)
  78.     EM.add_timer(0.01){ cb.call("!#{i}") }
  79.   end
  80.   def by_pk_blk(i)
  81.     EM.add_timer(0.01){ yield "#{i}!" }
  82.   end
  83. end
  84. conn = Conn.new
  85.  
  86. EM.synchrony do
  87.   res = []
  88.   await do |a|
  89.     100.times{|i|
  90.       conn.by_pk_cb(i, a.defer{|r| res[i] = r})
  91.       conn.by_pk_blk(i+100, &a.defer{|r| res[i+100] = r})
  92.     }
  93.   end
  94.   p res
  95.  
  96.   p once{|cb| conn.by_pk_cb(1, cb)}
  97.   p once{|cb| conn.by_pk_blk(1, &cb)}
  98.  
  99.   p 100.times.defer_map{|i, cb| conn.by_pk_cb(i, cb)}
  100.   p 100.times.defer_map{|i, cb| conn.by_pk_blk(i){|r| cb.call("*#{r}")}}
  101.   EM.stop
  102. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement