# Copyright (C) 2002  Koji Arai
# Copyright (C) 2002  Yoshinori K. Okuji
#
# You may redistribute it and/or modify it under the same term as Ruby.

require 'cache'

class FileCache
  def initialize(maxopen = 10)
    @cache = Cache.new(:max_num => maxopen) {|key, obj| obj.close}
    @saw = {}
  end
  
  def open(file)
    @cache.fetch(file) do
      mode = if @saw.key?(file) then 'a' else 'w' end
      @saw[file] = true
      File.open(file, mode)
    end
  end
  
  def close
    @cache.invalidate_all
  end
end

if $0 == __FILE__
  File.open("/tmp/foo", "w") {|f|
    1000.times {|i|
      f.printf("file%03d %d\n", rand(100), i)
    }
  }
  
  # /tmp/foo
  # foo001 0
  # foo099 1
  # foo050 2
  # foo001 3
  #   :
  #   :
  
  cacheout = FileCache.new(10)
  
  File.open("/tmp/foo") {|f|
    while line = f.gets
      file, number = line.split
      
      cacheout.open(file).puts number
    end
  }
end


syntax highlighted by Code2HTML, v. 0.9.1