MemoryStorage = async () => {
  let memory = {}

  /**
   * Puts data to memory.
   * @function
   * @param {string} hash The hash of the data to put.
   * @param {*} data The data to store.
   * @memberof module:Storage.Storage-Memory
   * @instance
   */
  const put = async (hash, data) => {
    memory[hash] = data
  }

  /**
   * Deletes data from memory.
   * @function
   * @param {string} hash The hash of the data to delete.
   * @memberof module:Storage.Storage-Memory
   * @instance
   */
  const del = async (hash) => {
    delete memory[hash]
  }

  /**
   * Gets data from memory.
   * @function
   * @param {string} hash The hash of the data to get.
   * @memberof module:Storage.Storage-Memory
   * @instance
   */
  const get = async (hash) => {
    return memory[hash]
  }

  /**
   * Iterates over records stored in memory.
   * @function
   * @yields [string, string] The next key/value pair from memory.
   * @memberof module:Storage.Storage-Memory
   * @instance
   */
  const iterator = async function * () {
    for await (const [key, value] of Object.entries(memory)) {
      yield [key, value]
    }
  }

  /**
   * Merges data from another source into memory.
   * @function
   * @param {module:Storage} other Another storage instance.
   * @memberof module:Storage.Storage-Memory
   * @instance
   */
  const merge = async (other) => {
    if (other) {
      for await (const [key, value] of other.iterator()) {
        put(key, value)
      }
    }
  }

  /**
  * Clears the contents of memory.
  * @function
  * @memberof module:Storage.Storage-Memory
  * @instance
  */
  const clear = async () => {
    memory = {}
  }

  const close = async () => {}

  return {
    put,
    del,
    get,
    iterator,
    merge,
    clear,
    close
  }
}
Creates an instance of MemoryStorage.
@function
@return {module:Storage.Storage-Memory} An instance of MemoryStorage.
@memberof module:Storage
@instance