easy-signal 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +2 -0
- package/README.md +36 -0
- package/index.d.ts +7 -0
- package/index.js +10 -0
- package/index.ts +20 -0
- package/package.json +30 -0
- package/tsconfig.json +16 -0
package/.gitattributes
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Easy Signal
|
|
2
|
+
|
|
3
|
+
A simple interface for creating a defined event or action that can be triggered with a set API and listened to by any number of subscribers.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm install easy-signal
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
A signal is a subscriber function that represents a single event. A signal function (the subscriber) has a function attached to it called `dispatch()` to trigger the event.
|
|
14
|
+
|
|
15
|
+
Signals offer similar functionality as the browser's `eventDispatcher` API, but rather than a general API for any event, each event would use its own signal. This allows each signal to have a specific function signature as opposed to the browser's generic `event` object. This is a great system in TypeScript being able to see the exact data each event produces.
|
|
16
|
+
|
|
17
|
+
### Basic Usage
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
// file seconds.ts
|
|
21
|
+
import { signal } from 'easy-signal';
|
|
22
|
+
|
|
23
|
+
// Create the signal and export it for outside use
|
|
24
|
+
export const onSecond = signal<(second: number) => any>();
|
|
25
|
+
|
|
26
|
+
setInterval(() => onMessage.dispatch(Math.floor(Date.now() / 1000)));
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { onSecond } from './seconds.ts';
|
|
31
|
+
|
|
32
|
+
// Typescript knows that seconds is a number because of the concrete type definition in seconds.ts
|
|
33
|
+
const unsubscribe = onSecond(seconds => {
|
|
34
|
+
console.log(seconds, 'since epoc');
|
|
35
|
+
});
|
|
36
|
+
```
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
declare type Args<T> = T extends (...args: infer A) => any ? A : never;
|
|
2
|
+
export declare type Signal<T extends (...args: any[]) => any = (...args: any[]) => any> = {
|
|
3
|
+
(listener: T): () => boolean;
|
|
4
|
+
dispatch: (...args: Args<T>) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function signal<T extends (...args: any[]) => any>(): Signal<T>;
|
|
7
|
+
export {};
|
package/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function signal() {
|
|
2
|
+
const listeners = new Set();
|
|
3
|
+
function subscribe(listener) {
|
|
4
|
+
listeners.add(listener);
|
|
5
|
+
return () => listeners.delete(listener);
|
|
6
|
+
}
|
|
7
|
+
subscribe.dispatch = (...args) => listeners.forEach(listener => listener(...args));
|
|
8
|
+
subscribe.clear = listeners.clear.bind(listeners);
|
|
9
|
+
return subscribe;
|
|
10
|
+
}
|
package/index.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type Args<T> = T extends (...args: infer A) => any ? A : never;
|
|
2
|
+
|
|
3
|
+
export type Signal<T extends (...args: any[]) => any = (...args: any[]) => any> = {
|
|
4
|
+
(listener: T): () => boolean;
|
|
5
|
+
dispatch: (...args: Args<T>) => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function signal<T extends (...args: any[]) => any>(): Signal<T> {
|
|
9
|
+
const listeners = new Set<T>();
|
|
10
|
+
|
|
11
|
+
function subscribe(listener: T) {
|
|
12
|
+
listeners.add(listener);
|
|
13
|
+
return () => listeners.delete(listener);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
subscribe.dispatch = (...args: Args<T>) => listeners.forEach(listener => listener(...args));
|
|
17
|
+
subscribe.clear = listeners.clear.bind(listeners);
|
|
18
|
+
|
|
19
|
+
return subscribe;
|
|
20
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "easy-signal",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A tiny (9 LOC), simple utility for alerting subscribers when an event happens.",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "tsc",
|
|
8
|
+
"prepare": "tsc"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/dabblewriter/easy-signal.git"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"Signal",
|
|
16
|
+
"events",
|
|
17
|
+
"typescript",
|
|
18
|
+
"subscriber",
|
|
19
|
+
"dispatcher"
|
|
20
|
+
],
|
|
21
|
+
"author": "Jacob Wright",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/dabblewriter/easy-signal/issues"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/dabblewriter/easy-signal#readme",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "^4.8.2"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2021",
|
|
4
|
+
"declaration": true,
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"allowJs": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"isolatedModules": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"es2021"
|
|
12
|
+
],
|
|
13
|
+
"resolveJsonModule": true
|
|
14
|
+
},
|
|
15
|
+
"exclude": ["node_modules"]
|
|
16
|
+
}
|