# # $Id: lazy.rb,v 1.5 2003/02/23 18:19:57 fukumoto Exp $ # require 'thread' def Lazy(*param, &p) Lazy.new(*param, &p) end class Lazy def initialize(*params, &block) super() @mutex = Mutex.new @done = false @value = nil @block = block @params = params end def __eval__ @mutex.synchronize do if not @done @value = @block.yield(*@params) @done = true @block = nil # to garbage collect @params = nil end end end def inspect if @done # sprintf("#", self.id, @value.inspect) @value.inspect else sprintf("#", self.id) end end def to_a if not @done then __eval__ end @value.to_a end def to_s if not @done then __eval__ end @value.to_s end def ==(other) if not @done then __eval__ end @value == other end def =~(other) if not @done then __eval__ end @value =~ other end def ===(other) if not @done then __eval__ end @value === other end def method_missing(name, *args, &p) if not @done then __eval__ end @value.__send__ name, *args, &p end end # end of class Lazy