UNPKG

2.12 kBJavaScriptView Raw
1'use strict';
2var call = require('../internals/function-call');
3var uncurryThis = require('../internals/function-uncurry-this');
4var bind = require('../internals/function-bind-context');
5var anObject = require('../internals/an-object');
6var aCallable = require('../internals/a-callable');
7var isNullOrUndefined = require('../internals/is-null-or-undefined');
8var getMethod = require('../internals/get-method');
9var wellKnownSymbol = require('../internals/well-known-symbol');
10
11var ASYNC_DISPOSE = wellKnownSymbol('asyncDispose');
12var DISPOSE = wellKnownSymbol('dispose');
13
14var push = uncurryThis([].push);
15
16// `GetDisposeMethod` abstract operation
17// https://tc39.es/proposal-explicit-resource-management/#sec-getdisposemethod
18var getDisposeMethod = function (V, hint) {
19 if (hint === 'async-dispose') {
20 var method = getMethod(V, ASYNC_DISPOSE);
21 if (method !== undefined) return method;
22 method = getMethod(V, DISPOSE);
23 return function () {
24 call(method, this);
25 };
26 } return getMethod(V, DISPOSE);
27};
28
29// `CreateDisposableResource` abstract operation
30// https://tc39.es/proposal-explicit-resource-management/#sec-createdisposableresource
31var createDisposableResource = function (V, hint, method) {
32 if (arguments.length < 3 && !isNullOrUndefined(V)) {
33 method = aCallable(getDisposeMethod(anObject(V), hint));
34 }
35
36 return method === undefined ? function () {
37 return undefined;
38 } : bind(method, V);
39};
40
41// `AddDisposableResource` abstract operation
42// https://tc39.es/proposal-explicit-resource-management/#sec-adddisposableresource
43module.exports = function (disposable, V, hint, method) {
44 var resource;
45 if (arguments.length < 4) {
46 // When `V`` is either `null` or `undefined` and hint is `async-dispose`,
47 // we record that the resource was evaluated to ensure we will still perform an `Await` when resources are later disposed.
48 if (isNullOrUndefined(V) && hint === 'sync-dispose') return;
49 resource = createDisposableResource(V, hint);
50 } else {
51 resource = createDisposableResource(undefined, hint, method);
52 }
53
54 push(disposable.stack, resource);
55};