rinda で作った FIFO のご紹介
最近 druby とか rinda とかちょースキ。
でもいざ druby とか rinda とか使ってアプリケーション作るには、ちょっとこいつら生っぽい。
それはデータ構造がないから!ってことで作ってみよう!
で作ったのが下のコード。FIFO を実装。まだバグっぽいけどそこそこ使えてますよ。
module Rinda class Queue attr :ts attr_reader :name def initialize tuple_space, name @ts = tuple_space @name = name begin @ts.read([@name, 'initialized', nil], 0) rescue Rinda::RequestExpiredError @ts.write [@name, 'initialized', true] @ts.write [@name, 'head', 0] @ts.write [@name, 'tail', 0] end end def size head = @ts.read [@name, 'head', nil] tail = @ts.read [@name, 'tail', nil] tail[2] - head[2] end def empty? size == 0 end def push value tail = @ts.take([@name, 'tail', nil])[2] @ts.write [@name, tail, value] @ts.write [@name, 'tail', tail + 1] self end alias_method "<<", :push def pop head = @ts.take([@name, 'head', nil])[2] tuple = @ts.take [@name, head, nil] @ts.write [@name, 'head', head + 1] tuple[2] end alias :shift :pop end end
なお、参考にしたのは「8¾Ï Rinda」。
seki さんってすごいなー。
このクラスとかその他作ってるクラスとかをまとめて rubyforge に登録しよーかと画策中です。
rinda ベースのライブラリってないみたいだし。