docs: function (fn) { var cache = {}
          return function (value, then) {
              if (value in cache) {                   //  there's a flaw: cache updates after fetch completes, so while fetch is running,
                  then (cache[value]) }               //  any subsequent call (until cache is ready) will trigger fetch (as it doesnt know that result is already fetching)
              else {
                  fn.call (this, value, function (result) {
                      then (cache[value] = result) }) } } }