Comparing version 0.7.5 to 0.8.0
@@ -0,1 +1,2 @@ | ||
declare type MaybePromise<T> = Promise<T> | PromiseLike<T> | T; | ||
export interface Unsubscribe { | ||
@@ -11,3 +12,3 @@ (): void; | ||
export interface Filter<T extends any[]> { | ||
(...args: T): boolean; | ||
(...args: T): MaybePromise<boolean>; | ||
} | ||
@@ -20,6 +21,14 @@ export interface Mapper<T extends any[], R> { | ||
} | ||
export declare type Listeners<T extends any[]> = Set<Listener<T>>; | ||
export declare type Listeners<T extends any[]> = Listener<T>[]; | ||
declare class FunctionExt extends Function { | ||
constructor(func: Function); | ||
} | ||
export interface Dismiss { | ||
(): Promise<void> | void; | ||
} | ||
export declare class Dismiss extends FunctionExt { | ||
constructor(dismiss: Unsubscribe); | ||
while(process: () => MaybePromise<any>): Promise<void>; | ||
after(count: number): Promise<() => void>; | ||
} | ||
export interface Event<T extends any[]> { | ||
@@ -36,2 +45,3 @@ (...args: T): Promise<void> | void; | ||
get size(): number; | ||
lacks(listener: Listener<T>): boolean; | ||
has(listener: Listener<T>): boolean; | ||
@@ -38,0 +48,0 @@ off(listener: Listener<T>): void; |
@@ -12,3 +12,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.Event = void 0; | ||
exports.Event = exports.Dismiss = void 0; | ||
class FunctionExt extends Function { | ||
@@ -20,8 +20,29 @@ constructor(func) { | ||
} | ||
class Dismiss extends FunctionExt { | ||
constructor(dismiss) { | ||
super(dismiss); | ||
} | ||
while(process) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield process(); | ||
this(); | ||
}); | ||
} | ||
after(count) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
return () => { | ||
if (!count--) { | ||
this(); | ||
} | ||
}; | ||
}); | ||
} | ||
} | ||
exports.Dismiss = Dismiss; | ||
function eventEmitter(listeners, ...args) { | ||
return Promise.all([...listeners].map((listener) => listener(...args))).then(() => void 0); | ||
return Promise.all(listeners.map((listener) => listener(...args))).then(() => void 0); | ||
} | ||
class Event extends FunctionExt { | ||
constructor(dispose) { | ||
const listeners = new Set(); | ||
const listeners = []; | ||
const fn = eventEmitter.bind(null, listeners); | ||
@@ -48,13 +69,21 @@ super(fn); | ||
get size() { | ||
return this.listeners.size; | ||
return this.listeners.length; | ||
} | ||
lacks(listener) { | ||
return this.listeners.indexOf(listener) === -1; | ||
} | ||
has(listener) { | ||
return this.listeners.has(listener); | ||
return !this.lacks(listener); | ||
} | ||
off(listener) { | ||
this.listeners.delete(listener); | ||
const index = this.listeners.indexOf(listener); | ||
if (index !== -1) { | ||
this.listeners.splice(index, 1); | ||
} | ||
} | ||
on(listener) { | ||
this.listeners.add(listener); | ||
return () => this.off(listener); | ||
if (this.lacks(listener)) { | ||
this.listeners.push(listener); | ||
} | ||
return new Dismiss(() => this.off(listener)); | ||
} | ||
@@ -69,3 +98,3 @@ once(listener) { | ||
clear() { | ||
this.listeners.clear(); | ||
this.listeners.splice(0); | ||
} | ||
@@ -72,0 +101,0 @@ toPromise() { |
{ | ||
"name": "evnty", | ||
"version": "0.7.5", | ||
"version": "0.8.0", | ||
"description": "0-Deps, simple, fast, for browser and node js anonymous event library", | ||
"main": "build/index.js", | ||
"types": "build/index.d.ts", | ||
"files": [ | ||
"build", | ||
"src/index.ts" | ||
], | ||
"scripts": { | ||
@@ -11,3 +15,3 @@ "build": "rm -rf build && NODE_ENV=production tsc", | ||
"test:cov": "COVERAGE=true jest", | ||
"lint": "eslint .", | ||
"lint": "eslint src", | ||
"prepare": "husky install" | ||
@@ -42,3 +46,3 @@ }, | ||
"husky": "^7.0.4", | ||
"jest": "^27.5.1", | ||
"jest": "27", | ||
"prettier": "^2.6.2", | ||
@@ -45,0 +49,0 @@ "pretty-quick": "^3.1.3", |
@@ -11,28 +11,77 @@ # Evnty | ||
## Table of Contents | ||
- [Features](#features) | ||
- [Browser Support](#browser-support) | ||
- [Installing](#installing) | ||
- [Examples](#examples) | ||
- [Roadmap](#roadmap) | ||
- [License](#license) | ||
## Features | ||
- Promises support | ||
- Full-featured typeScript support | ||
- Browser & Workers environment compatibility | ||
- Performance eventemitter3/eventemitter2/event-emitter/events/native node/native browser | ||
## Roadmap | ||
- Namespaces/Wildcards | ||
- Times To Listen (TTL) | ||
- Subscribe/UnSubscribe | ||
## Browser Support | ||
| ![Chrome][chrome-image] | ![Firefox][firefox-image] | ![Safari][safari-image] | ![Opera][opera-image] | ![Edge][edge-image] | | ||
| ----------------------- | ------------------------- | ----------------------- | --------------------- | ------------------- | | ||
| Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | | ||
[chrome-image]: https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png?1 | ||
[firefox-image]: https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png?1 | ||
[safari-image]: https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png?1 | ||
[opera-image]: https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png?1 | ||
[edge-image]: https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png?1 | ||
## Installing | ||
Using yarn: | ||
```bash | ||
yarn add evnty | ||
``` | ||
Using npm: | ||
```bash | ||
npm install evnty | ||
``` | ||
## Interface | ||
```typescript | ||
declare type Unsubscribe = () => void; | ||
declare type Listener = (...args: any[]) => void; | ||
declare type Dispose = () => void; | ||
declare type Filter = (...args: any[]) => boolean; | ||
declare type Mapper = <T = any>(...args: any[]) => T; | ||
declare type Reducer = <T = any>(value: any, ...args: any[]) => T; | ||
type Unsubscribe = () => void; | ||
type Listener = (...args: any[]) => void; | ||
type Dispose = () => void; | ||
type Filter = (...args: any[]) => boolean; | ||
type Mapper = <T = any>(...args: any[]) => T; | ||
type Reducer = <T = any>(value: any, ...args: any[]) => T; | ||
declare class Event { | ||
static merge(...events: Event[]): Event; | ||
static interval(interval: number): Event; | ||
class Event { | ||
static merge(...events: Event[]): Event; | ||
static interval(interval: number): Event; | ||
readonly size: Number; | ||
readonly size: Number; | ||
constructor(dispose?: Dispose); | ||
has(listener: Listener): boolean; | ||
off(listener: Listener): void; | ||
on(listener: Listener): Unsubscribe; | ||
once(listener: Listener): Unsubscribe; | ||
clear(): void; | ||
toPromise(): Promise<any[]>; | ||
filter(filter: Filter): Event; | ||
map(mapper: Mapper): Event; | ||
reduce(reducer: Reducer, init: any): Event; | ||
constructor(dispose?: Dispose); | ||
has(listener: Listener): boolean; | ||
off(listener: Listener): void; | ||
on(listener: Listener): Unsubscribe; | ||
once(listener: Listener): Unsubscribe; | ||
clear(): void; | ||
toPromise(): Promise<any[]>; | ||
filter(filter: Filter): Event; | ||
map(mapper: Mapper): Event; | ||
reduce(reducer: Reducer, init: any): Event; | ||
dispose(): Dispose; | ||
} | ||
@@ -54,6 +103,4 @@ ``` | ||
function handleInput({ button, key }) { | ||
function handleInput({ button, key }) {} | ||
} | ||
const inputEvent = Event.merge(clickEvent, keyPressEvent); | ||
@@ -68,3 +115,2 @@ inputEvent.on(handleInput); | ||
clickEvent({ button: 'right' }); | ||
@@ -82,2 +128,3 @@ clickEvent({ button: 'left' }); | ||
## License | ||
License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | ||
@@ -84,0 +131,0 @@ Copyright (c) 2021-present Ivan Zakharchanka |
@@ -0,1 +1,3 @@ | ||
type MaybePromise<T> = Promise<T> | PromiseLike<T> | T; | ||
export interface Unsubscribe { | ||
@@ -14,3 +16,3 @@ (): void; | ||
export interface Filter<T extends any[]> { | ||
(...args: T): boolean; | ||
(...args: T): MaybePromise<boolean>; | ||
} | ||
@@ -26,3 +28,3 @@ | ||
export type Listeners<T extends any[]> = Set<Listener<T>>; | ||
export type Listeners<T extends any[]> = Listener<T>[]; | ||
@@ -36,4 +38,25 @@ class FunctionExt extends Function { | ||
export interface Dismiss { | ||
(): Promise<void> | void; | ||
} | ||
export class Dismiss extends FunctionExt { | ||
constructor(dismiss: Unsubscribe) { | ||
super(dismiss); | ||
} | ||
async while(process: () => MaybePromise<any>) { | ||
await process(); | ||
this(); | ||
} | ||
async after(count: number) { | ||
return () => { | ||
if (!count--) { | ||
this(); | ||
} | ||
}; | ||
} | ||
} | ||
function eventEmitter<A extends any[]>(listeners: Listeners<A>, ...args: A) { | ||
return Promise.all([...listeners].map((listener) => listener(...args))).then(() => void 0); | ||
return Promise.all(listeners.map((listener) => listener(...args))).then(() => void 0); | ||
} | ||
@@ -66,3 +89,3 @@ | ||
constructor(dispose?: Dispose) { | ||
const listeners = new Set<Listener<T>>(); | ||
const listeners: Listeners<T> = []; | ||
const fn: (...args: T) => Promise<void> = eventEmitter.bind(null, listeners); | ||
@@ -78,16 +101,25 @@ super(fn); | ||
get size(): number { | ||
return this.listeners.size; | ||
return this.listeners.length; | ||
} | ||
lacks(listener: Listener<T>): boolean { | ||
return this.listeners.indexOf(listener) === -1; | ||
} | ||
has(listener: Listener<T>): boolean { | ||
return this.listeners.has(listener); | ||
return !this.lacks(listener); | ||
} | ||
off(listener: Listener<T>): void { | ||
this.listeners.delete(listener); | ||
const index = this.listeners.indexOf(listener); | ||
if (index !== -1) { | ||
this.listeners.splice(index, 1); | ||
} | ||
} | ||
on(listener: Listener<T>): Unsubscribe { | ||
this.listeners.add(listener); | ||
return () => this.off(listener); | ||
if (this.lacks(listener)) { | ||
this.listeners.push(listener); | ||
} | ||
return new Dismiss(() => this.off(listener)); | ||
} | ||
@@ -104,3 +136,3 @@ | ||
clear() { | ||
this.listeners.clear(); | ||
this.listeners.splice(0); | ||
} | ||
@@ -107,0 +139,0 @@ |
Sorry, the diff of this file is not supported yet
20327
335
138