Singleton
![Comment coverage](https://github.com/heap-code/singleton/raw/HEAD/.badges/comment/coverage.svg)
A simple singleton implementation with lazy initialization.
Installation
Simply run:
npm install @heap-code/singleton
Usage
Wrap a value that should only be calculated once and only when needed:
import { Singleton } from "@heap-code/singleton";
const mySingleton = new Singleton(() => Math.random());
console.log(mySingleton.get() === mySingleton.get());
Promise
It also works with Promise
as they are only fulfilled once:
import { Singleton } from "@heap-code/singleton";
function doAsyncStuff() {
return new Promise(resolve => {
console.log("It doesn't look like it, but I'm actually doing a lot of things.");
setTimeout(() => resolve(new Date().getMilliseconds()), 100);
});
}
async function bootstrap() {
const a1 = await doAsyncStuff();
const a2 = await doAsyncStuff();
console.log(a1 === a2);
const singleton = new Singleton(() => doAsyncStuff());
const b1 = await singleton.get();
const b2 = await singleton.get();
console.log(b1 === b2);
}
bootstrap();
Note:
Rather use this library for its lazy initialization rather than its "singletoness":
Example:
import { Singleton } from "@heap-code/singleton";
class MyAddition {
public readonly added: number;
private readonly singleton: Singleton<number>;
public constructor(private readonly a: number, private readonly b: number) {
this.added = a + b;
this.singleton = new Singleton(() => Math.pow(a * b, Math.sin(a) * Math.cos(b)));
}
public get divided() {
return this.a / this.b;
}
public get complicated() {
return this.singleton.get();
}
}
Releases
See information about breaking changes and release notes here.
Author's note
This is not the most useful package, as it can most of the time be simply replaced by a variable.
And come consider it to be an anti-pattern (Singleton pattern criticism).
This package was more a test for automating changelogs generation, GitHub and npm publishing process.