#
# We can insert data into the PreloadStore when the document is loaded.
# The data can be accessed once by a key, after which it is removed.
#
window.PreloadStore =

  data: {}

  store: (key, value) ->
    @data[key] = value

  # To retrieve a key, you provide the key you want, plus a finder to
  # load it if the key cannot be found. Once the key is used once, it is
  # removed from the store. So, for example, you can't load a preloaded topic
  # more than once.
  get: (key, finder) ->
    promise = new RSVP.Promise

    if @data[key]
      promise.resolve(@data[key])
      delete @data[key]
    else
      if finder
        result = finder()

        # If the finder returns a promise, we support that too
        if result.then
          result.then (result) ->
            promise.resolve(result)
          , (result) -> promise.reject(result)
        else
          promise.resolve(result)
      else
        promise.resolve(undefined)

    promise

  # Does the store contain a particular key? Does not delete, just returns
  # true or false.
  contains: (key) -> @data[key] isnt undefined

  # If we are sure it's preloaded, we don't have to supply a finder. Just
  # returns undefined if it's not in the store.
  getStatic: (key) ->
    result = @data[key]
    delete @data[key]
    result