class Geminabox::Geminabox::DiskCache

def cache(key)

def cache(key)
  key_hash = key_hash(key)
  read(key_hash) || write(key_hash, yield)
end

def ensure_dir_exists!

def ensure_dir_exists!
  FileUtils.mkdir_p(root_path)
end

def flush

def flush
  FileUtils.rm_rf(root_path)
  ensure_dir_exists!
end

def flush_key(key)

def flush_key(key)
  path = path(key_hash(key))
  FileUtils.rm_f(path)
end

def initialize(root_path)

def initialize(root_path)
  @root_path = root_path
  ensure_dir_exists!
end

def key_hash(key)

def key_hash(key)
  Digest::MD5.hexdigest(key)
end

def marshal_cache(key)

def marshal_cache(key)
  key_hash = key_hash(key)
  marshal_read(key_hash) || marshal_write(key_hash, yield)
end

def marshal_read(key_hash)

def marshal_read(key_hash)
  read_int(key_hash) { |path| Marshal.load(File.open(path)) }
end

def marshal_write(key_hash, value)

def marshal_write(key_hash, value)
  write_int(key_hash) { |f| Marshal.dump(value, f) }
  value
end

def path(key_hash)

def path(key_hash)
  File.join(root_path, key_hash)
end

def read(key_hash)

def read(key_hash)
  read_int(key_hash) { |path| File.read(path) }
end

def read_int(key_hash)

def read_int(key_hash)
  path = path(key_hash)
  yield(path) if File.exists?(path)
end

def write(key_hash, value)

def write(key_hash, value)
  write_int(key_hash) { |f| f << value }
  value
end

def write_int(key_hash)

def write_int(key_hash)
  File.open(path(key_hash), 'wb') { |f| yield(f) }
end