diff --git a/packages/lib/LRUCache.ts b/packages/lib/LRUCache.ts index babeeaf..40f0fb7 100644 --- a/packages/lib/LRUCache.ts +++ b/packages/lib/LRUCache.ts @@ -2,7 +2,7 @@ export class LRUCache { map = new Map() keys: T[] = [] - constructor(readonly maxSize: number) {} + constructor(readonly maxSize: number = Infinity) {} has(k: T) { return this.map.has(k) diff --git a/packages/lib/Store.ts b/packages/lib/Store.ts index 0fcbc9d..0ec9a6c 100644 --- a/packages/lib/Store.ts +++ b/packages/lib/Store.ts @@ -9,11 +9,18 @@ type Unsubscriber = () => void type R = Record type M = Map -export interface IDerivable { - get: () => T +export interface ISubscribable { subscribe(this: void, run: Subscriber, invalidate?: Invalidator): Unsubscriber } +export interface ISettable { + set: (xs: T) => void +} + +export interface IDerivable extends ISubscribable { + get: () => T +} + export interface IReadable extends IDerivable { derived: (f: (v: T) => U) => IReadable throttle(t: number): IReadable @@ -339,44 +346,3 @@ export const asReadable = (store: IDerivable) => { throttle: (t: number) => new Derived(store, identity, t), } } - -export type ICustomStore = { - get: () => T - start: (set: (x: T) => void) => () => void -} - -export const customStore = ({get, start}: ICustomStore) => { - const subs: Subscriber[] = [] - - const set = (newValue: T) => { - value = newValue - - for (const sub of subs) { - sub(value) - } - } - - let stop: () => void - let value = get() - - return asReadable({ - get: () => subs.length === 0 ? get() : value, - subscribe: (sub: Subscriber) => { - subs.push(sub) - - if (subs.length === 1) { - stop = start(set) - set(get()) - } - - return () => { - subs.splice(subs.findIndex(s => s === sub), 1) - - if (subs.length === 0) { - stop() - } - } - }, - }) -} - diff --git a/packages/util/Repository.ts b/packages/util/Repository.ts index 166e76e..8b97537 100644 --- a/packages/util/Repository.ts +++ b/packages/util/Repository.ts @@ -1,8 +1,8 @@ import {throttle} from 'throttle-debounce' -import type {IReadable, Subscriber, Invalidator} from '@welshman/lib' -import {Derived, flatten, Emitter, sortBy, customStore, inc, first, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib' +import type {ISubscribable, ISettable, Subscriber, Invalidator} from '@welshman/lib' +import {flatten, Emitter, sortBy, inc, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib' import {DELETE} from './Kinds' -import {EPOCH, matchFilter, getIdFilters, matchFilters} from './Filters' +import {EPOCH, matchFilter} from './Filters' import {isReplaceable, isTrustedEvent} from './Events' import {getAddress} from './Address' import type {Filter} from './Filters' @@ -18,7 +18,7 @@ export type RepositoryOptions = { throttle?: number } -export class Repository extends Emitter implements IReadable { +export class Repository extends Emitter implements ISubscribable, ISettable { eventsById = new Map() eventsByAddress = new Map() eventsByTag = new Map() @@ -68,41 +68,6 @@ export class Repository extends Emitter implements IReadable { } } - derived(f: (v: TrustedEvent[]) => U): Derived { - return new Derived(this, f) - } - - throttle(t: number): Derived { - return new Derived(this, identity, t) - } - - filter(filters: Filter[], {includeDeleted = false} = {}) { - const getValue = () => this.query(filters, {includeDeleted}) - - return customStore({ - get: getValue, - start: setValue => { - const onEvent = (event: TrustedEvent) => { - if (matchFilters(filters, event)) { - setValue(getValue()) - } - } - - const onRefresh = () => { - setValue(getValue()) - } - - this.on('event', onEvent) - this.on('delete', onRefresh) - - return () => { - this.off('event', onEvent) - this.off('delete', onRefresh) - } - }, - }) - } - notifyUpdate = maybeThrottle(this.options.throttle, () => { const events = this.get() @@ -138,10 +103,6 @@ export class Repository extends Emitter implements IReadable { return duplicate && duplicate.created_at >= event.created_at } - watchEvent(idOrAddress: string) { - return this.filter(getIdFilters([idOrAddress]), {includeDeleted: true}).derived(first) - } - query(filters: Filter[], {includeDeleted = false} = {}) { const result: TrustedEvent[][] = [] for (let filter of filters) {