Skip to content

Commit

Permalink
kerosene: Add Deferred class
Browse files Browse the repository at this point in the history
  • Loading branch information
nhardy committed Sep 28, 2022
1 parent bb20776 commit 0f3f7a5
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 4 deletions.
2 changes: 1 addition & 1 deletion packages/kerosene-test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
"utils"
],
"dependencies": {
"@kablamo/kerosene": "^0.0.28",
"@kablamo/kerosene": "^0.0.29",
"@types/lodash": "^4.14.184",
"@types/sinon": "^10.0.13",
"lodash": "^4.17.21",
Expand Down
4 changes: 2 additions & 2 deletions packages/kerosene-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@kablamo/kerosene-ui",
"version": "0.0.28",
"version": "0.0.29",
"repository": "https://github.com/KablamoOSS/kerosene/tree/master/packages/kerosene-ui",
"bugs": {
"url": "https://github.com/KablamoOSS/kerosene/issues"
Expand All @@ -22,7 +22,7 @@
},
"dependencies": {
"@babel/runtime": "^7.18.9",
"@kablamo/kerosene": "^0.0.28",
"@kablamo/kerosene": "^0.0.29",
"@types/lodash": "^4.14.184",
"lodash": "^4.17.21"
},
Expand Down
2 changes: 1 addition & 1 deletion packages/kerosene/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@kablamo/kerosene",
"version": "0.0.28",
"version": "0.0.29",
"repository": "https://github.com/KablamoOSS/kerosene/tree/master/packages/kerosene",
"bugs": {
"url": "https://github.com/KablamoOSS/kerosene/issues"
Expand Down
4 changes: 4 additions & 0 deletions packages/kerosene/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ Returns the provided `value` rounded to the number of significant `figures` prov

## Promise

### `Deferred`

Deferred is a class that allows a Promise to be created in advance of the code that will `resolve`/`reject` it.

### `mapSeries(items, iteratee)`

Maps over `items` with a promise-returning `iteratee` in series.
Expand Down
1 change: 1 addition & 0 deletions packages/kerosene/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export { default as toDegrees } from "./math/toDegrees";
export { default as toRadians } from "./math/toRadians";
export { default as toSignificantFigures } from "./math/toSignificantFigures";

export { default as Deferred } from "./promise/Deferred";
export { default as mapSeries } from "./promise/mapSeries";

export * from "./string";
Expand Down
20 changes: 20 additions & 0 deletions packages/kerosene/src/promise/Deferred.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import timeout from "../function/timeout";
import Deferred from "./Deferred";

describe("Deferred", () => {
it("should allow a Promise to be created and resolved", async () => {
const deferred = new Deferred<boolean>();
deferred.resolve(true);

await expect(deferred.promise).resolves.toBe(true);
});

it("should allow a Promise to be created and reject", async () => {
const deferred = new Deferred();
const error = new Error("an error");
// Promise must be rejected _after_ a catch handler has been attached or we will see UnhandledPromiseRejection from Node
timeout(0).then(() => deferred.reject(error));

await expect(deferred.promise).rejects.toBe(error);
});
});
19 changes: 19 additions & 0 deletions packages/kerosene/src/promise/Deferred.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { Mutable } from "../types";

/**
* Deferred is a class that allows a Promise to be created in advance of the code that will `resolve`/`reject` it.
*/
export default class Deferred<T> {
public readonly promise: Promise<T>;

public readonly resolve!: (value: T) => void;

public readonly reject!: (reason?: unknown) => void;

constructor() {
this.promise = new Promise<T>((resolve, reject) => {
(this as Mutable<typeof this>).resolve = resolve;
(this as Mutable<typeof this>).reject = reject;
});
}
}

0 comments on commit 0f3f7a5

Please sign in to comment.