-var fs = require('fs')
-var util = require('util')
+let fs = require('fs')
+let util = require('util')
-var statAsync = util.promisify(fs.stat)
+let fs_stat = util.promisify(fs.stat)
-var BuildCache = function() {
+let BuildCache = function() {
if (!this instanceof BuildCache)
throw Error('BuildCache is a constructor')
this.map = new Map()
}
-BuildCache.prototype.get = async function(key) {
- var result = this.map.get(key)
- if (result === undefined)
- return undefined
- var deps = result.deps
- var time = result.time
- for (var i = 0; i < deps.length; ++i) {
- stats = await statAsync(deps[i])
- if (stats.mtimeMs > time) {
- this.map.delete(key)
- return undefined
+BuildCache.prototype.get = async function(key, build_func) {
+ let result = this.map.get(key)
+ if (result !== undefined) {
+ let deps = result.deps
+ let time = result.time
+ for (let i = 0; i < deps.length; ++i) {
+ stats = await fs_stat(deps[i])
+ if (stats.mtimeMs > time) {
+ this.map.delete(key)
+ result = undefined
+ break
+ }
}
}
+ if (result === undefined) {
+ result = {deps: [key], time: Date.now()}
+ await build_func(result)
+ this.map.set(key, result)
+ }
return result.value
}
-BuildCache.prototype.set = function(key, value, deps) {
- this.map.set(
- key,
- {
- value: value,
- deps: deps === undefined ? [key] : deps,
- time: Date.now()
- }
- )
-}
-
module.exports = BuildCache