code: func (c *Cache) ReadOrCreate(id string,
  	read func(info ItemInfo, r io.Reader) error,
  	create func(info ItemInfo, w io.WriteCloser) error) (info ItemInfo, err error) {
  	id = cleanID(id)
  
  	c.nlocker.Lock(id)
  	defer c.nlocker.Unlock(id)
  
  	info = ItemInfo{Name: id}
  
  	if r := c.getOrRemove(id); r != nil {
  		err = read(info, r)
  		defer r.Close()
  		return
  	}
  
  	f, err := helpers.OpenFileForWriting(c.Fs, id)
  	if err != nil {
  		return
  	}
  
  	err = create(info, f)
  
  	return
  
  }
docs: // ReadOrCreate tries to lookup the file in cache.
  // If found, it is passed to read and then closed.
  // If not found a new file is created and passed to create, which should close
  // it when done.