text: 'use strict';
  
  Object.defineProperty(exports, '__esModule', { value: true });
  
  // @todo Add logger on options to debug when caches go wrong.
  function createFallbackableCache(options) {
      const caches = [...options.caches];
      const current = caches.shift(); // eslint-disable-line functional/immutable-data
      if (current === undefined) {
          return createNullCache();
      }
      return {
          get(key, defaultValue, events = {
              miss: () => Promise.resolve(),
          }) {
              return current.get(key, defaultValue, events).catch(() => {
                  return createFallbackableCache({ caches }).get(key, defaultValue, events);
              });
          },
          set(key, value) {
              return current.set(key, value).catch(() => {
                  return createFallbackableCache({ caches }).set(key, value);
              });
          },
          delete(key) {
              return current.delete(key).catch(() => {
                  return createFallbackableCache({ caches }).delete(key);
              });
          },
          clear() {
              return current.clear().catch(() => {
                  return createFallbackableCache({ caches }).clear();
              });
          },
      };
  }
  
  function createNullCache() {
      return {
          get(_key, defaultValue, events = {
              miss: () => Promise.resolve(),
          }) {
              const value = defaultValue();
              return value
                  .then(result => Promise.all([result, events.miss(result)]))
                  .then(([result]) => result);
          },
          set(_key, value) {
              return Promise.resolve(value);
          },
          delete(_key) {
              return Promise.resolve();
          },
          clear() {
              return Promise.resolve();
          },
      };
  }
  
  exports.createFallbackableCache = createFallbackableCache;
  exports.createNullCache = createNullCache;
  