Skip to content

Commit

Permalink
Rename pubSub and fix createStore
Browse files Browse the repository at this point in the history
  • Loading branch information
djalmajr committed Apr 16, 2023
1 parent d9d0f96 commit 28cb165
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 52 deletions.
23 changes: 23 additions & 0 deletions src/createEmitter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type { Fn, Obj } from './types';

type Callback = Fn<[...any], any>;

export function createEmitter() {
const fns = <Obj<Callback[]>>{};

const emit = (key: string, ...args: unknown[]) => {
fns[key]?.forEach((fn) => fn(...args));
};

const off = (key: string, fn: Callback) => {
fns[key] = fns[key].filter((f: Callback) => f !== fn);
};

const on = (key: string, fn: Callback) => {
fns[key] ||= [];
if (!fns[key].includes(fn)) fns[key] = fns[key].concat(fn);
return () => off(key, fn);
};

return { emit, off, on };
}
56 changes: 28 additions & 28 deletions src/createStore.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
import { createEmitter } from './createEmitter';
import { isFunction } from './isFunction';
import { isObject } from './isObject';
import { omit } from './omit';
import { Obj } from './types';

function handler(callback: Function) {
return {
get(obj: Obj, key: string) {
if (key === '_isProxy') return true;
const d = Object.getOwnPropertyDescriptor(obj, key);
const ok = isObject(obj[key]) && !obj[key]._isProxy && d?.writable;
ok && (obj[key] = new Proxy(obj[key], handler(callback)));
return obj[key];
},
set(obj: Obj, key: string, val: unknown) {
if (obj[key] !== val) (obj[key] = val), callback(obj);
return true;
},
deleteProperty(obj: Obj, key: string) {
delete obj[key];
callback(obj);
return true;
},
};
}
const { emit, on } = createEmitter();

const handler = () => ({
get(obj: Obj, key: string) {
if (key === '_isProxy') return true;
const d = Object.getOwnPropertyDescriptor(obj, key);
const nok = isObject(obj[key]) && !obj[key]._isProxy && d?.writable;
nok && (obj[key] = new Proxy(obj[key], handler()));
return obj[key];
},
set(obj: Obj, key: string, val: unknown) {
if (obj[key] !== val) (obj[key] = val), emit('update');
return true;
},
deleteProperty(obj: Obj, key: string) {
delete obj[key];
emit('update');
return true;
},
});

export function createStore<T = Obj>(init: T): T & { subscribe(fn: (s: T) => void): () => never } {
const fns = <Function[]>[];
Expand All @@ -34,14 +36,12 @@ export function createStore<T = Obj>(init: T): T & { subscribe(fn: (s: T) => voi
};

let nextTickId = 0;
const store = new Proxy(
Object.assign(init as never, { subscribe }),
// eslint-disable-next-line @typescript-eslint/no-unused-vars
handler(({ subscribe, ...data }: Obj) => {
if (nextTickId) cancelAnimationFrame(nextTickId);
nextTickId = requestAnimationFrame(() => fns.forEach((fn) => fn(data)));
}),
);
const store = new Proxy(Object.assign(init as never, { subscribe }), handler());
on('update', () => {
const data = omit('subscribe', store);
if (nextTickId) cancelAnimationFrame(nextTickId);
nextTickId = requestAnimationFrame(() => fns.forEach((fn) => fn(data)));
});

for (const prop in init) {
const d = Object.getOwnPropertyDescriptor(init, prop);
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export * from './contains';
export * from './copy';
export * from './createAjax';
export * from './createCache';
export * from './createEmitter';
export * from './createStore';
export * from './curry';
export * from './debounce';
Expand Down Expand Up @@ -44,7 +45,6 @@ export * from './parseJWT';
export * from './pascalCase';
export * from './pick';
export * from './promisify';
export * from './pubSub';
export * from './random';
export * from './set';
export * from './size';
Expand Down
23 changes: 0 additions & 23 deletions src/pubSub.ts

This file was deleted.

0 comments on commit 28cb165

Please sign in to comment.