lazy expiry

lazy expiry

by ozzymcduff

HTML

<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-2.3.2.css">
<script src="//code.jquery.com/qunit/qunit-2.3.2.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

JavaScript

function lazyExpiry(gen) {
  var reference = null
  var expiry = null
  return function () {
    let exp = expiry,
      ref = reference
    if (ref !== null && exp !== null && exp > Date.now()) {
      return ref
    }

    var val = gen()

    if (!val && val.length !== 2 && (typeof val[1] === 'number')) {
      throw new Error('Expected return value of generator to be an array of two values, where the last value is a number (representing when it expires).')
    }

    ref = reference = val[0]
    exp = expiry = new Date(Date.now() + val[1])
    return ref
  }
}


function t(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, ms);
  });
}
var test = QUnit.test;

test("Basic test of lazy expiring value", function(assert) {
  var done = assert.async();
  var c = 1

  function gen() {
    let expiresIn = 100 // ms
    return [c++, expiresIn]
  }
  var v = lazyExpiry(gen);
  assert.equal(v(), "1", "initial value");
  t(10).then(() => {
    assert.equal(v(), "1", "snd value")
    return t(10)
  }).then(() => {
    assert.equal(v(), "1", "thrd value")
    return t(100)
  }).then(() => {
    assert.equal(v(), "2", "after 100 ms should gen next value")
  }).then(done)
});