cometっぽいのが書きたくなったので、たくさんある実装のうちのなんていう名前かわからないけど、知っている状態と違う状態になったら返事がほしいよ! 作戦でやってみる。
当然だがTupleSpaceを使う。[:latest, ほげ]というタプルが最後の状態を保持するタプルってことにしよう。ほげはなんでも良いんだけど、時刻にする。
class Foo def initialize ... @ts = Rinda::TupleSpace.new(3) end def latest @ts.read([:latest, nil])[1] end def foo @ts.take([:latest, nil]) begin ... ensure @ts.write([:latest, Time.now]) end end end
Rindaのタプルスペースのマッチングはcase equals(===)を使うので、このオブジェクトとこのオブジェクトは違う!を表現するには工夫が必要になっちゃう。今回はNjetという否定を表現するクラスを作ってみた。Foo#waitは自分が知っているの違う状態になるのを5秒(以上)待つ。
class Foo def wait(key) @ts.read([:latest, Njet.new(key)], 5) end end class Njet def initialize(value) @value = value end def ===(other) @value != other end end