@tanstack/store 0.0.1-beta.86 → 0.0.1-beta.88

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.
@@ -19,6 +19,9 @@ class Store {
19
19
  constructor(initialState, options) {
20
20
  this.state = initialState;
21
21
  this.options = options;
22
+ if (this.options?.onUpdate) {
23
+ this.subscribe(this.options?.onUpdate);
24
+ }
22
25
  }
23
26
  subscribe = listener => {
24
27
  this.listeners.add(listener);
@@ -31,25 +34,22 @@ class Store {
31
34
  setState = updater => {
32
35
  const previous = this.state;
33
36
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
34
- if (this.state === previous) return;
35
- this.options?.onUpdate?.(this.state, previous);
36
- this.#flush(previous);
37
+ this.#flush();
37
38
  };
38
- #flush = previous => {
39
+ #flush = () => {
39
40
  if (this.#batching) return;
40
41
  const flushId = ++this.#flushing;
41
42
  this.listeners.forEach(listener => {
42
43
  if (this.#flushing !== flushId) return;
43
- listener(this.state, previous);
44
+ listener(this.state);
44
45
  });
45
46
  };
46
47
  batch = cb => {
47
48
  if (this.#batching) return cb();
48
- const previous = this.state;
49
49
  this.#batching = true;
50
50
  cb();
51
51
  this.#batching = false;
52
- this.#flush(previous);
52
+ this.#flush();
53
53
  };
54
54
  }
55
55
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState, prev: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState, prev: TState) => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n if (this.state === previous) return\n\n this.options?.onUpdate?.(this.state, previous)\n\n this.#flush(previous)\n }\n\n #flush = (previous: TState) => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state, previous)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n const previous = this.state\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush(previous)\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACxB,GAAA;EAEAE,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACP,SAAS,CAACQ,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACP,SAAS,CAACW,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;AAE9B,IAAA,IAAI,IAAI,CAACT,KAAK,KAAKS,QAAQ,EAAE,OAAA;IAE7B,IAAI,CAACV,OAAO,EAAEY,QAAQ,GAAG,IAAI,CAACX,KAAK,EAAES,QAAQ,CAAC,CAAA;AAE9C,IAAA,IAAI,CAAC,MAAM,CAACA,QAAQ,CAAC,CAAA;GACtB,CAAA;EAED,MAAM,GAAIA,QAAgB,IAAK;AAC7B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAMG,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEX,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKU,OAAO,EAAE,OAAA;AAChCV,MAAAA,QAAQ,CAAC,IAAI,CAACF,KAAK,EAAES,QAAQ,CAAC,CAAA;AAChC,KAAC,CAAC,CAAA;GACH,CAAA;EAEDK,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,MAAMN,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBe,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;AACtB,IAAA,IAAI,CAAC,MAAM,CAACN,QAAQ,CAAC,CAAA;GACtB,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;MAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;AACxC,KAAA;AACF,GAAA;EAEAC,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;EAED,MAAM,GAAG,MAAM;AACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;AAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;AACtB,KAAC,CAAC,CAAA;GACH,CAAA;EAEDc,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBA,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
@@ -15,6 +15,9 @@ class Store {
15
15
  constructor(initialState, options) {
16
16
  this.state = initialState;
17
17
  this.options = options;
18
+ if (this.options?.onUpdate) {
19
+ this.subscribe(this.options?.onUpdate);
20
+ }
18
21
  }
19
22
  subscribe = listener => {
20
23
  this.listeners.add(listener);
@@ -27,25 +30,22 @@ class Store {
27
30
  setState = updater => {
28
31
  const previous = this.state;
29
32
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
30
- if (this.state === previous) return;
31
- this.options?.onUpdate?.(this.state, previous);
32
- this.#flush(previous);
33
+ this.#flush();
33
34
  };
34
- #flush = previous => {
35
+ #flush = () => {
35
36
  if (this.#batching) return;
36
37
  const flushId = ++this.#flushing;
37
38
  this.listeners.forEach(listener => {
38
39
  if (this.#flushing !== flushId) return;
39
- listener(this.state, previous);
40
+ listener(this.state);
40
41
  });
41
42
  };
42
43
  batch = cb => {
43
44
  if (this.#batching) return cb();
44
- const previous = this.state;
45
45
  this.#batching = true;
46
46
  cb();
47
47
  this.#batching = false;
48
- this.#flush(previous);
48
+ this.#flush();
49
49
  };
50
50
  }
51
51
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState, prev: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState, prev: TState) => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n if (this.state === previous) return\n\n this.options?.onUpdate?.(this.state, previous)\n\n this.#flush(previous)\n }\n\n #flush = (previous: TState) => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state, previous)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n const previous = this.state\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush(previous)\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACxB,GAAA;EAEAE,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACP,SAAS,CAACQ,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACP,SAAS,CAACW,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;AAE9B,IAAA,IAAI,IAAI,CAACT,KAAK,KAAKS,QAAQ,EAAE,OAAA;IAE7B,IAAI,CAACV,OAAO,EAAEY,QAAQ,GAAG,IAAI,CAACX,KAAK,EAAES,QAAQ,CAAC,CAAA;AAE9C,IAAA,IAAI,CAAC,MAAM,CAACA,QAAQ,CAAC,CAAA;GACtB,CAAA;EAED,MAAM,GAAIA,QAAgB,IAAK;AAC7B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAMG,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEX,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKU,OAAO,EAAE,OAAA;AAChCV,MAAAA,QAAQ,CAAC,IAAI,CAACF,KAAK,EAAES,QAAQ,CAAC,CAAA;AAChC,KAAC,CAAC,CAAA;GACH,CAAA;EAEDK,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,MAAMN,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBe,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;AACtB,IAAA,IAAI,CAAC,MAAM,CAACN,QAAQ,CAAC,CAAA;GACtB,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;AAgBO,MAAMA,KAAK,CAGhB;EACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;EAGvC,SAAS,GAAG,KAAK,CAAA;EACjB,SAAS,GAAG,CAAC,CAAA;AAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;IAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;IACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;MAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;AACxC,KAAA;AACF,GAAA;EAEAC,SAAS,GAAIC,QAA0B,IAAK;AAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;IAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;AAC/BE,MAAAA,KAAK,IAAI,CAAA;KACV,CAAA;GACF,CAAA;EAEDG,QAAQ,GAAIC,OAAiB,IAAK;AAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;IAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;EAED,MAAM,GAAG,MAAM;AACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;AACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;AAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;AACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;AAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;AACtB,KAAC,CAAC,CAAA;GACH,CAAA;EAEDc,KAAK,GAAIC,EAAc,IAAK;AAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrBA,IAAAA,EAAE,EAAE,CAAA;AACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC,MAAM,EAAE,CAAA;GACd,CAAA;AACH;;;;"}
@@ -4024,7 +4024,7 @@ var drawChart = (function (exports) {
4024
4024
  </script>
4025
4025
  <script>
4026
4026
  /*<!--*/
4027
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/store/src/index.ts","uid":"1628-1"}]}],"isRoot":true},"nodeParts":{"1628-1":{"renderedLength":1178,"gzipLength":392,"brotliLength":0,"mainUid":"1628-0"}},"nodeMetas":{"1628-0":{"id":"/packages/store/src/index.ts","moduleParts":{"index.production.js":"1628-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4027
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/store/src/index.ts","uid":"3f9a-1"}]}],"isRoot":true},"nodeParts":{"3f9a-1":{"renderedLength":1106,"gzipLength":376,"brotliLength":0,"mainUid":"3f9a-0"}},"nodeMetas":{"3f9a-0":{"id":"/packages/store/src/index.ts","moduleParts":{"index.production.js":"3f9a-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.79.1"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
4028
4028
 
4029
4029
  const run = () => {
4030
4030
  const width = window.innerWidth;
@@ -8,7 +8,7 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "packages/store/src/index.ts",
11
- "uid": "1628-3"
11
+ "uid": "3f9a-3"
12
12
  }
13
13
  ]
14
14
  }
@@ -16,18 +16,18 @@
16
16
  "isRoot": true
17
17
  },
18
18
  "nodeParts": {
19
- "1628-3": {
20
- "renderedLength": 1178,
21
- "gzipLength": 392,
19
+ "3f9a-3": {
20
+ "renderedLength": 1106,
21
+ "gzipLength": 376,
22
22
  "brotliLength": 0,
23
- "mainUid": "1628-2"
23
+ "mainUid": "3f9a-2"
24
24
  }
25
25
  },
26
26
  "nodeMetas": {
27
- "1628-2": {
27
+ "3f9a-2": {
28
28
  "id": "/packages/store/src/index.ts",
29
29
  "moduleParts": {
30
- "index.production.js": "1628-3"
30
+ "index.production.js": "3f9a-3"
31
31
  },
32
32
  "imported": [],
33
33
  "importedBy": [],
@@ -9,11 +9,11 @@
9
9
  * @license MIT
10
10
  */
11
11
  type AnyUpdater = (...args: any[]) => any;
12
- type Listener<TState> = (next: TState, prev: TState) => void;
12
+ type Listener<TState> = (next: TState) => void;
13
13
  interface StoreOptions<TState, TUpdater extends AnyUpdater = (cb: TState) => TState> {
14
14
  updateFn?: (previous: TState) => (updater: TUpdater) => TState;
15
15
  onSubscribe?: (listener: Listener<TState>, store: Store<TState, TUpdater>) => () => void;
16
- onUpdate?: (next: TState, prev: TState) => void;
16
+ onUpdate?: (next: TState) => TState;
17
17
  }
18
18
  declare class Store<TState, TUpdater extends AnyUpdater = (cb: TState) => TState> {
19
19
  #private;
@@ -21,6 +21,9 @@
21
21
  constructor(initialState, options) {
22
22
  this.state = initialState;
23
23
  this.options = options;
24
+ if (this.options?.onUpdate) {
25
+ this.subscribe(this.options?.onUpdate);
26
+ }
24
27
  }
25
28
  subscribe = listener => {
26
29
  this.listeners.add(listener);
@@ -33,25 +36,22 @@
33
36
  setState = updater => {
34
37
  const previous = this.state;
35
38
  this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);
36
- if (this.state === previous) return;
37
- this.options?.onUpdate?.(this.state, previous);
38
- this.#flush(previous);
39
+ this.#flush();
39
40
  };
40
- #flush = previous => {
41
+ #flush = () => {
41
42
  if (this.#batching) return;
42
43
  const flushId = ++this.#flushing;
43
44
  this.listeners.forEach(listener => {
44
45
  if (this.#flushing !== flushId) return;
45
- listener(this.state, previous);
46
+ listener(this.state);
46
47
  });
47
48
  };
48
49
  batch = cb => {
49
50
  if (this.#batching) return cb();
50
- const previous = this.state;
51
51
  this.#batching = true;
52
52
  cb();
53
53
  this.#batching = false;
54
- this.#flush(previous);
54
+ this.#flush();
55
55
  };
56
56
  }
57
57
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState, prev: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState, prev: TState) => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n if (this.state === previous) return\n\n this.options?.onUpdate?.(this.state, previous)\n\n this.#flush(previous)\n }\n\n #flush = (previous: TState) => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state, previous)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n const previous = this.state\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush(previous)\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;;;EAgBO,MAAMA,KAAK,CAGhB;IACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;IAGvC,SAAS,GAAG,KAAK,CAAA;IACjB,SAAS,GAAG,CAAC,CAAA;EAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;MAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;MACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;EACxB,GAAA;IAEAE,SAAS,GAAIC,QAA0B,IAAK;EAC1C,IAAA,IAAI,CAACP,SAAS,CAACQ,GAAG,CAACD,QAAQ,CAAC,CAAA;MAC5B,MAAME,KAAK,GAAG,IAAI,CAACL,OAAO,EAAEM,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;EACzD,IAAA,OAAO,MAAM;EACX,MAAA,IAAI,CAACP,SAAS,CAACW,MAAM,CAACJ,QAAQ,CAAC,CAAA;EAC/BE,MAAAA,KAAK,IAAI,CAAA;OACV,CAAA;KACF,CAAA;IAEDG,QAAQ,GAAIC,OAAiB,IAAK;EAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;MAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEW,QAAQ,GAC/B,IAAI,CAACX,OAAO,CAACW,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;EAE9B,IAAA,IAAI,IAAI,CAACT,KAAK,KAAKS,QAAQ,EAAE,OAAA;MAE7B,IAAI,CAACV,OAAO,EAAEY,QAAQ,GAAG,IAAI,CAACX,KAAK,EAAES,QAAQ,CAAC,CAAA;EAE9C,IAAA,IAAI,CAAC,MAAM,CAACA,QAAQ,CAAC,CAAA;KACtB,CAAA;IAED,MAAM,GAAIA,QAAgB,IAAK;EAC7B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;EACpB,IAAA,MAAMG,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;EAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEX,QAAQ,IAAK;EACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKU,OAAO,EAAE,OAAA;EAChCV,MAAAA,QAAQ,CAAC,IAAI,CAACF,KAAK,EAAES,QAAQ,CAAC,CAAA;EAChC,KAAC,CAAC,CAAA;KACH,CAAA;IAEDK,KAAK,GAAIC,EAAc,IAAK;EAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;EAC/B,IAAA,MAAMN,QAAQ,GAAG,IAAI,CAACT,KAAK,CAAA;EAC3B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;EACrBe,IAAAA,EAAE,EAAE,CAAA;EACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;EACtB,IAAA,IAAI,CAAC,MAAM,CAACN,QAAQ,CAAC,CAAA;KACtB,CAAA;EACH;;;;;;;;;;"}
1
+ {"version":3,"file":"index.development.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["Store","listeners","Set","constructor","initialState","options","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;;;;;;;EAgBO,MAAMA,KAAK,CAGhB;IACAC,SAAS,GAAG,IAAIC,GAAG,EAAoB,CAAA;IAGvC,SAAS,GAAG,KAAK,CAAA;IACjB,SAAS,GAAG,CAAC,CAAA;EAEbC,EAAAA,WAAW,CAACC,YAAoB,EAAEC,OAAwC,EAAE;MAC1E,IAAI,CAACC,KAAK,GAAGF,YAAY,CAAA;MACzB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;EACtB,IAAA,IAAI,IAAI,CAACA,OAAO,EAAEE,QAAQ,EAAE;QAC1B,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,OAAO,EAAEE,QAAQ,CAAC,CAAA;EACxC,KAAA;EACF,GAAA;IAEAC,SAAS,GAAIC,QAA0B,IAAK;EAC1C,IAAA,IAAI,CAACR,SAAS,CAACS,GAAG,CAACD,QAAQ,CAAC,CAAA;MAC5B,MAAME,KAAK,GAAG,IAAI,CAACN,OAAO,EAAEO,WAAW,GAAGH,QAAQ,EAAE,IAAI,CAAC,CAAA;EACzD,IAAA,OAAO,MAAM;EACX,MAAA,IAAI,CAACR,SAAS,CAACY,MAAM,CAACJ,QAAQ,CAAC,CAAA;EAC/BE,MAAAA,KAAK,IAAI,CAAA;OACV,CAAA;KACF,CAAA;IAEDG,QAAQ,GAAIC,OAAiB,IAAK;EAChC,IAAA,MAAMC,QAAQ,GAAG,IAAI,CAACV,KAAK,CAAA;MAC3B,IAAI,CAACA,KAAK,GAAG,IAAI,CAACD,OAAO,EAAEY,QAAQ,GAC/B,IAAI,CAACZ,OAAO,CAACY,QAAQ,CAACD,QAAQ,CAAC,CAACD,OAAO,CAAC,GACvCA,OAAO,CAASC,QAAQ,CAAC,CAAA;MAE9B,IAAI,CAAC,MAAM,EAAE,CAAA;KACd,CAAA;IAED,MAAM,GAAG,MAAM;EACb,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAA;EACpB,IAAA,MAAME,OAAO,GAAG,EAAE,IAAI,CAAC,SAAS,CAAA;EAChC,IAAA,IAAI,CAACjB,SAAS,CAACkB,OAAO,CAAEV,QAAQ,IAAK;EACnC,MAAA,IAAI,IAAI,CAAC,SAAS,KAAKS,OAAO,EAAE,OAAA;EAChCT,MAAAA,QAAQ,CAAC,IAAI,CAACH,KAAK,CAAC,CAAA;EACtB,KAAC,CAAC,CAAA;KACH,CAAA;IAEDc,KAAK,GAAIC,EAAc,IAAK;EAC1B,IAAA,IAAI,IAAI,CAAC,SAAS,EAAE,OAAOA,EAAE,EAAE,CAAA;EAC/B,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;EACrBA,IAAAA,EAAE,EAAE,CAAA;EACJ,IAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;MACtB,IAAI,CAAC,MAAM,EAAE,CAAA;KACd,CAAA;EACH;;;;;;;;;;"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).Store={})}(this,(function(t){"use strict";t.Store=class{listeners=new Set;#t=!1;#s=0;constructor(t,s){this.state=t,this.options=s}subscribe=t=>{this.listeners.add(t);const s=this.options?.onSubscribe?.(t,this);return()=>{this.listeners.delete(t),s?.()}};setState=t=>{const s=this.state;this.state=this.options?.updateFn?this.options.updateFn(s)(t):t(s),this.state!==s&&(this.options?.onUpdate?.(this.state,s),this.#e(s))};#e=t=>{if(this.#t)return;const s=++this.#s;this.listeners.forEach((e=>{this.#s===s&&e(this.state,t)}))};batch=t=>{if(this.#t)return t();const s=this.state;this.#t=!0,t(),this.#t=!1,this.#e(s)}},Object.defineProperty(t,"__esModule",{value:!0})}));
11
+ !function(t,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).Store={})}(this,(function(t){"use strict";t.Store=class{listeners=new Set;#t=!1;#s=0;constructor(t,s){this.state=t,this.options=s,this.options?.onUpdate&&this.subscribe(this.options?.onUpdate)}subscribe=t=>{this.listeners.add(t);const s=this.options?.onSubscribe?.(t,this);return()=>{this.listeners.delete(t),s?.()}};setState=t=>{const s=this.state;this.state=this.options?.updateFn?this.options.updateFn(s)(t):t(s),this.#e()};#e=()=>{if(this.#t)return;const t=++this.#s;this.listeners.forEach((s=>{this.#s===t&&s(this.state)}))};batch=t=>{if(this.#t)return t();this.#t=!0,t(),this.#t=!1,this.#e()}},Object.defineProperty(t,"__esModule",{value:!0})}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState, prev: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState, prev: TState) => void\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n if (this.state === previous) return\n\n this.options?.onUpdate?.(this.state, previous)\n\n this.#flush(previous)\n }\n\n #flush = (previous: TState) => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state, previous)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n const previous = this.state\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush(previous)\n }\n}\n"],"names":["listeners","Set","batching","flushing","constructor","initialState","options","this","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;qPAgBO,MAILA,UAAY,IAAIC,IAGhBC,IAAY,EACZC,GAAY,EAEZC,YAAYC,EAAsBC,GAChCC,KAAKC,MAAQH,EACbE,KAAKD,QAAUA,CACjB,CAEAG,UAAaC,IACXH,KAAKP,UAAUW,IAAID,GACnB,MAAME,EAAQL,KAAKD,SAASO,cAAcH,EAAUH,MACpD,MAAO,KACLA,KAAKP,UAAUc,OAAOJ,GACtBE,KAAS,CACV,EAGHG,SAAYC,IACV,MAAMC,EAAWV,KAAKC,MACtBD,KAAKC,MAAQD,KAAKD,SAASY,SACvBX,KAAKD,QAAQY,SAASD,EAAtBV,CAAgCS,GAC/BA,EAAgBC,GAEjBV,KAAKC,QAAUS,IAEnBV,KAAKD,SAASa,WAAWZ,KAAKC,MAAOS,GAErCV,MAAKa,EAAOH,GAAS,EAGvBG,GAAUH,IACR,GAAIV,MAAKL,EAAW,OACpB,MAAMmB,IAAYd,MAAKJ,EACvBI,KAAKP,UAAUsB,SAASZ,IAClBH,MAAKJ,IAAckB,GACvBX,EAASH,KAAKC,MAAOS,EAAS,GAC9B,EAGJM,MAASC,IACP,GAAIjB,MAAKL,EAAW,OAAOsB,IAC3B,MAAMP,EAAWV,KAAKC,MACtBD,MAAKL,GAAY,EACjBsB,IACAjB,MAAKL,GAAY,EACjBK,MAAKa,EAAOH,EAAS"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/index.ts"],"sourcesContent":["export type AnyUpdater = (...args: any[]) => any\n\nexport type Listener<TState> = (next: TState) => void\n\ninterface StoreOptions<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n updateFn?: (previous: TState) => (updater: TUpdater) => TState\n onSubscribe?: (\n listener: Listener<TState>,\n store: Store<TState, TUpdater>,\n ) => () => void\n onUpdate?: (next: TState) => TState\n}\n\nexport class Store<\n TState,\n TUpdater extends AnyUpdater = (cb: TState) => TState,\n> {\n listeners = new Set<Listener<TState>>()\n state: TState\n options?: StoreOptions<TState, TUpdater>\n #batching = false\n #flushing = 0\n\n constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {\n this.state = initialState\n this.options = options\n if (this.options?.onUpdate) {\n this.subscribe(this.options?.onUpdate)\n }\n }\n\n subscribe = (listener: Listener<TState>) => {\n this.listeners.add(listener)\n const unsub = this.options?.onSubscribe?.(listener, this)\n return () => {\n this.listeners.delete(listener)\n unsub?.()\n }\n }\n\n setState = (updater: TUpdater) => {\n const previous = this.state\n this.state = this.options?.updateFn\n ? this.options.updateFn(previous)(updater)\n : (updater as any)(previous)\n\n this.#flush()\n }\n\n #flush = () => {\n if (this.#batching) return\n const flushId = ++this.#flushing\n this.listeners.forEach((listener) => {\n if (this.#flushing !== flushId) return\n listener(this.state)\n })\n }\n\n batch = (cb: () => void) => {\n if (this.#batching) return cb()\n this.#batching = true\n cb()\n this.#batching = false\n this.#flush()\n }\n}\n"],"names":["listeners","Set","batching","flushing","constructor","initialState","options","this","state","onUpdate","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","flush","flushId","forEach","batch","cb"],"mappings":";;;;;;;;;;qPAgBO,MAILA,UAAY,IAAIC,IAGhBC,IAAY,EACZC,GAAY,EAEZC,YAAYC,EAAsBC,GAChCC,KAAKC,MAAQH,EACbE,KAAKD,QAAUA,EACXC,KAAKD,SAASG,UAChBF,KAAKG,UAAUH,KAAKD,SAASG,SAEjC,CAEAC,UAAaC,IACXJ,KAAKP,UAAUY,IAAID,GACnB,MAAME,EAAQN,KAAKD,SAASQ,cAAcH,EAAUJ,MACpD,MAAO,KACLA,KAAKP,UAAUe,OAAOJ,GACtBE,KAAS,CACV,EAGHG,SAAYC,IACV,MAAMC,EAAWX,KAAKC,MACtBD,KAAKC,MAAQD,KAAKD,SAASa,SACvBZ,KAAKD,QAAQa,SAASD,EAAtBX,CAAgCU,GAC/BA,EAAgBC,GAErBX,MAAKa,GAAQ,EAGfA,GAAS,KACP,GAAIb,MAAKL,EAAW,OACpB,MAAMmB,IAAYd,MAAKJ,EACvBI,KAAKP,UAAUsB,SAASX,IAClBJ,MAAKJ,IAAckB,GACvBV,EAASJ,KAAKC,MAAM,GACpB,EAGJe,MAASC,IACP,GAAIjB,MAAKL,EAAW,OAAOsB,IAC3BjB,MAAKL,GAAY,EACjBsB,IACAjB,MAAKL,GAAY,EACjBK,MAAKa,GAAQ"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/store",
3
3
  "author": "Tanner Linsley",
4
- "version": "0.0.1-beta.86",
4
+ "version": "0.0.1-beta.88",
5
5
  "license": "MIT",
6
6
  "repository": "tanstack/store",
7
7
  "homepage": "https://tanstack.com/store",
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type AnyUpdater = (...args: any[]) => any
2
2
 
3
- export type Listener<TState> = (next: TState, prev: TState) => void
3
+ export type Listener<TState> = (next: TState) => void
4
4
 
5
5
  interface StoreOptions<
6
6
  TState,
@@ -11,7 +11,7 @@ interface StoreOptions<
11
11
  listener: Listener<TState>,
12
12
  store: Store<TState, TUpdater>,
13
13
  ) => () => void
14
- onUpdate?: (next: TState, prev: TState) => void
14
+ onUpdate?: (next: TState) => TState
15
15
  }
16
16
 
17
17
  export class Store<
@@ -27,6 +27,9 @@ export class Store<
27
27
  constructor(initialState: TState, options?: StoreOptions<TState, TUpdater>) {
28
28
  this.state = initialState
29
29
  this.options = options
30
+ if (this.options?.onUpdate) {
31
+ this.subscribe(this.options?.onUpdate)
32
+ }
30
33
  }
31
34
 
32
35
  subscribe = (listener: Listener<TState>) => {
@@ -44,28 +47,23 @@ export class Store<
44
47
  ? this.options.updateFn(previous)(updater)
45
48
  : (updater as any)(previous)
46
49
 
47
- if (this.state === previous) return
48
-
49
- this.options?.onUpdate?.(this.state, previous)
50
-
51
- this.#flush(previous)
50
+ this.#flush()
52
51
  }
53
52
 
54
- #flush = (previous: TState) => {
53
+ #flush = () => {
55
54
  if (this.#batching) return
56
55
  const flushId = ++this.#flushing
57
56
  this.listeners.forEach((listener) => {
58
57
  if (this.#flushing !== flushId) return
59
- listener(this.state, previous)
58
+ listener(this.state)
60
59
  })
61
60
  }
62
61
 
63
62
  batch = (cb: () => void) => {
64
63
  if (this.#batching) return cb()
65
- const previous = this.state
66
64
  this.#batching = true
67
65
  cb()
68
66
  this.#batching = false
69
- this.#flush(previous)
67
+ this.#flush()
70
68
  }
71
69
  }