pnpm
Version:
Fast, disk space efficient package manager
119 lines (103 loc) • 3.1 kB
JavaScript
/** @license MIT License (c) copyright 2010-2016 original author or authors */
/** @author Brian Cavalier */
/** @author John Hann */
import Disposable from './Disposable'
import SettableDisposable from './SettableDisposable'
import { isPromise } from '../Promise'
import * as base from '@most/prelude'
var map = base.map
var identity = base.id
/**
* Call disposable.dispose. If it returns a promise, catch promise
* error and forward it through the provided sink.
* @param {number} t time
* @param {{dispose: function}} disposable
* @param {{error: function}} sink
* @return {*} result of disposable.dispose
*/
export function tryDispose (t, disposable, sink) {
var result = disposeSafely(disposable)
return isPromise(result)
? result.catch(function (e) {
sink.error(t, e)
})
: result
}
/**
* Create a new Disposable which will dispose its underlying resource
* at most once.
* @param {function} dispose function
* @param {*?} data any data to be passed to disposer function
* @return {Disposable}
*/
export function create (dispose, data) {
return once(new Disposable(dispose, data))
}
/**
* Create a noop disposable. Can be used to satisfy a Disposable
* requirement when no actual resource needs to be disposed.
* @return {Disposable|exports|module.exports}
*/
export function empty () {
return new Disposable(identity, void 0)
}
/**
* Create a disposable that will dispose all input disposables in parallel.
* @param {Array<Disposable>} disposables
* @return {Disposable}
*/
export function all (disposables) {
return create(disposeAll, disposables)
}
function disposeAll (disposables) {
return Promise.all(map(disposeSafely, disposables))
}
function disposeSafely (disposable) {
try {
return disposable.dispose()
} catch (e) {
return Promise.reject(e)
}
}
/**
* Create a disposable from a promise for another disposable
* @param {Promise<Disposable>} disposablePromise
* @return {Disposable}
*/
export function promised (disposablePromise) {
return create(disposePromise, disposablePromise)
}
function disposePromise (disposablePromise) {
return disposablePromise.then(disposeOne)
}
function disposeOne (disposable) {
return disposable.dispose()
}
/**
* Create a disposable proxy that allows its underlying disposable to
* be set later.
* @return {SettableDisposable}
*/
export function settable () {
return new SettableDisposable()
}
/**
* Wrap an existing disposable (which may not already have been once()d)
* so that it will only dispose its underlying resource at most once.
* @param {{ dispose: function() }} disposable
* @return {Disposable} wrapped disposable
*/
export function once (disposable) {
return new Disposable(disposeMemoized, memoized(disposable))
}
function disposeMemoized (memoized) {
if (!memoized.disposed) {
memoized.disposed = true
memoized.value = disposeSafely(memoized.disposable)
memoized.disposable = void 0
}
return memoized.value
}
function memoized (disposable) {
return { disposed: false, disposable: disposable, value: void 0 }
}