UNPKG

pnpm

Version:

Fast, disk space efficient package manager

119 lines (103 loc) 3.1 kB
/** @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 } }