text: 'use strict';
  
  // Map from URL to { timestamp: last fetch time, data: data }.
  let regularUpdateCache = Object.create(null);
  
  // url: a string, scraper: a function that takes string data at that URL.
  // interval: number in milliseconds.
  // cb: a callback function that takes an error and data returned by the scraper.
  function regularUpdate({
    url,
    intervalMillis,
    json = true,
    scraper = buffer => buffer,
    options = {},
    request = require('request'),
  }, cb) {
    const timestamp = Date.now();
    const cached = regularUpdateCache[url];
    if (cached != null &&
        (timestamp - cached.timestamp) < intervalMillis) {
      cb(null, cached.data);
      return;
    }
    request(url, options, (err, res, buffer) => {
      if (err != null) { cb(err); return; }
  
      let reqData;
      if (json) {
        try {
          reqData = JSON.parse(buffer);
        } catch(e) { cb(e); return; }
      } else {
        reqData = buffer;
      }
  
      let data;
      try {
        data = scraper(reqData);
      } catch(e) { cb(e); return; }
  
      regularUpdateCache[url] = { timestamp, data };
      cb(null, data);
    });
  }
  
  function clearRegularUpdateCache() {
    regularUpdateCache = Object.create(null);
  }
  
  module.exports = {
    regularUpdate,
    clearRegularUpdateCache
  };
  