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 ベースのライブラリってないみたいだし。