Class: CRuby::Event

Inherits:
Object
  • Object
show all
Defined in:
lib/cruby/event.rb

Defined Under Namespace

Classes: BEvt

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bevts) ⇒ Event

Returns a new instance of Event.



13
14
15
# File 'lib/cruby/event.rb', line 13

def initialize bevts
  @evts = bevts
end

Instance Attribute Details

#evtsObject (readonly)

Returns the value of attribute evts.



2
3
4
# File 'lib/cruby/event.rb', line 2

def evts
  @evts
end

Class Method Details

.choose(evts) ⇒ Object

イベントを選択する



44
45
46
# File 'lib/cruby/event.rb', line 44

def self.choose evts
  CRuby::Event.new((evts.map {|ev| ev.evts}).flatten)
end

.select(evts) ⇒ Object



48
49
50
# File 'lib/cruby/event.rb', line 48

def self.select evts
  CRuby::Event.choose(evts).sync
end

Instance Method Details

#syncObject



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/cruby/event.rb', line 17

def sync
  bevt = @evts.find {|evt| evt.pollFn.call() }
  if bevt then
    bevt.doFn.call()
  else
    callcc {|k|
      flag = [false]
      @evts.each {|evt| evt.blockFn.call(flag,k) }
      CRuby::Coroutine.dispatch()
    }
  end
end

#wrap(&f) ⇒ Object

新しいイベントを生成する



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/cruby/event.rb', line 31

def wrap &f
  CRuby::Event.new(@evts.map {|evt|
              doFn = Proc.new { f.call(evt.doFn.call()) }
              blockFn = Proc.new {|flg,k|     # k はsync実行後の継続
                callcc {|kk|                  # kk はblockFn実行後の継続
                  k.call(f.call(callcc {|kkk| # kkk は元のblockFn実行後の継続
                                  kk.call(evt.blockFn.call(flg,kkk))
                                }))}}
              BEvt.new(evt.pollFn,doFn,blockFn)
            })
end