30 lines
680 B
JavaScript
30 lines
680 B
JavaScript
|
var Nil = {}
|
||
|
|
||
|
module.exports = cache
|
||
|
|
||
|
// cache := (Continuable<T>) => Continuable<T>
|
||
|
function cache(source) {
|
||
|
var _err = Nil
|
||
|
var _value = Nil
|
||
|
var _result = null
|
||
|
var listeners = null
|
||
|
|
||
|
return function continuable(callback) {
|
||
|
if (_err !== Nil || _value !== Nil) {
|
||
|
callback(_err, _value)
|
||
|
} else if (listeners) {
|
||
|
listeners.push(callback)
|
||
|
} else {
|
||
|
listeners = [callback]
|
||
|
_result = source(function (err, value) {
|
||
|
_err = err
|
||
|
_value = value
|
||
|
|
||
|
listeners.forEach(function (l) { l(err, value) })
|
||
|
})
|
||
|
}
|
||
|
|
||
|
return _result
|
||
|
}
|
||
|
}
|