Skip to content

Commit

Permalink
refactor: clean code
Browse files Browse the repository at this point in the history
  • Loading branch information
crimx committed Jan 13, 2025
1 parent fb6dd72 commit 067e031
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 25 deletions.
29 changes: 12 additions & 17 deletions src/abortable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type {
Disposer,
} from "./interface";

import { dispose } from "./utils";
import { dispose, isFn } from "./utils";

/**
* A {@link DisposableDisposer} that can be safely self-disposed.
Expand All @@ -16,12 +16,13 @@ import { dispose } from "./utils";
interface AbortableDisposable {
(): any;
dispose: (this: void) => any;
abortable: (onDispose?: () => void) => void;
abortable: (onDispose: () => void) => void;
}

interface AbortableDisposableImpl extends AbortableDisposable {
/** onDisposer */
_o?: (() => any) | null;
abortable: (onDispose?: () => void) => void;
/** deps */
_o?: (() => any) | null | void;
}

/**
Expand All @@ -47,14 +48,11 @@ interface AbortableDisposableImpl extends AbortableDisposable {
* ```
*/
export const abortable: (disposable: DisposableType) => DisposableDisposer = (
disposable: DisposableType | null
disposable: DisposableType | void
): DisposableDisposer => {
const abortable: AbortableDisposableImpl = (): void => {
abortable.abortable();
if (disposable) {
dispose(disposable);
disposable = null;
}
disposable = dispose(disposable);
};
abortable.dispose = abortable;
abortable.abortable = abortable$abortable;
Expand All @@ -65,16 +63,13 @@ function abortable$abortable(
this: AbortableDisposableImpl,
onDispose?: () => void
): void {
if (this._o) {
try {
this._o();
} catch (e) {
console.error(e);
}
}
dispose(this?._o);
this._o = onDispose;
}

export const isAbortable = (
disposable: any
): disposable is AbortableDisposable => disposable && disposable.abortable;
): disposable is AbortableDisposable =>
isFn(disposable) &&
isFn((disposable as AbortableDisposable).dispose) &&
isFn((disposable as AbortableDisposable).abortable);
15 changes: 7 additions & 8 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import type { Disposer, IDisposable } from "./interface";
import type { DisposableType, Disposer, IDisposable } from "./interface";

export const isFn = (value: any): value is (...args: any[]) => any =>
!!(value && value.constructor && value.call && value.apply);

/**
* Dispose a disposable object or a disposer function. Log the error if any.
* @param disposable A disposable object or a disposer function. Do nothing otherwise.
*/
export function dispose(disposable: any): void {
export function dispose(disposable?: DisposableType | null | void): void {
try {
if (disposable) {
if ((disposable as IDisposable).dispose) {
if (isFn((disposable as IDisposable).dispose)) {
// isDisposableObject
(disposable as IDisposable).dispose();
} else if (
disposable.constructor &&
disposable.call &&
disposable.apply
) {
} else if (isFn(disposable)) {
// isFunction
(disposable as Disposer)();
}
Expand Down

0 comments on commit 067e031

Please sign in to comment.