@valentin30/signal 0.0.2 → 0.0.3

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/dist/index.d.mts CHANGED
@@ -1,203 +1,153 @@
1
- type Maybe<T> = T | null | undefined
1
+ type Maybe<T> = T | null | undefined;
2
2
 
3
3
  type Factory<Fn extends FactoryFunction> = Fn & {
4
- factory(factory: Maybe<Fn>): void
5
- default(factory: Maybe<Fn>): void
6
- configured(): boolean
7
- }
8
- type FactoryFunction = (...args: any[]) => any
4
+ factory(factory: Maybe<Fn>): void;
5
+ default(factory: Maybe<Fn>): void;
6
+ configured(): boolean;
7
+ };
8
+ type FactoryFunction = (...args: any[]) => any;
9
9
 
10
10
  interface Collector$1<T> {
11
- add(value: T): void
12
- collect(callback: () => void): Readonly<Set<T>>
13
- }
14
- interface CollectorFactoryFunction {
15
- <T>(): Collector$1<T>
11
+ add(value: T): void;
12
+ collect(callback: () => void): Readonly<Set<T>>;
16
13
  }
17
- type collector_type = typeof collector$1
18
- interface collector$1 extends collector_type {}
19
- declare const collector$1: Factory<CollectorFactoryFunction>
14
+ type CollectorFactoryFunction = <T>() => Collector$1<T>;
15
+ declare const collector$1: Factory<CollectorFactoryFunction>;
20
16
 
21
- type Equals<T> = (value: T, other: T) => boolean
17
+ type Equals<T> = (value: T, other: T) => boolean;
22
18
  interface Comparable<T> {
23
- equals(other: T): boolean
19
+ equals(other: T): boolean;
24
20
  }
25
21
 
26
22
  interface Reader<T> {
27
- read(): T
23
+ read(): T;
28
24
  }
29
25
 
30
- type Callback = () => void
26
+ type Callback = () => void;
31
27
 
32
28
  interface Subscription {
33
- subscribe(callback: Callback): Callback
34
- unsubscribe(callback: Callback): void
29
+ subscribe(callback: Callback): Callback;
30
+ unsubscribe(callback: Callback): void;
35
31
  }
36
32
 
37
33
  interface Writer<T> {
38
- write(value: T): void
34
+ write(value: T): void;
39
35
  }
40
36
 
41
- interface Signal$1<T> extends Reader<T>, Writer<T>, Comparable<T>, Subscription {}
42
- interface ReadonlySignal<T> extends Reader<T>, Comparable<T>, Subscription {}
43
- interface SignalFactoryFunction {
44
- <T>(value: T, equals?: Equals<T>): Signal$1<T>
37
+ interface Signal$1<T> extends Reader<T>, Writer<T>, Comparable<T>, Subscription {
45
38
  }
46
- declare const signal$1: Factory<SignalFactoryFunction>
47
-
48
- interface ComposedFactoryFunction {
49
- <T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Signal$1<T>
39
+ interface ReadonlySignal<T> extends Reader<T>, Comparable<T>, Subscription {
50
40
  }
51
- declare const composed$1: Factory<ComposedFactoryFunction>
41
+ type SignalFactoryFunction = <T>(value: T, equals?: Equals<T>) => Signal$1<T>;
42
+ declare const signal$1: Factory<SignalFactoryFunction>;
52
43
 
53
- interface ComputedFactoryFunction {
54
- <T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>
55
- }
56
- declare const computed$1: Factory<ComputedFactoryFunction>
44
+ type ComposedFactoryFunction = <T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>) => Signal$1<T>;
45
+ declare const composed$1: Factory<ComposedFactoryFunction>;
57
46
 
58
- declare function collector<T>(): Collector$1<T>
47
+ type ComputedFactoryFunction = <T>(compute: () => T, equals?: Equals<T>) => ReadonlySignal<T>;
48
+ declare const computed$1: Factory<ComputedFactoryFunction>;
49
+
50
+ type Effect = () => void;
51
+ type EffectCallback = (init: boolean) => EffectCleanup | void;
52
+ type EffectCleanup = (destroy: boolean) => void;
53
+ type EffectFactoryFunction = (callback: EffectCallback) => Effect;
54
+ declare const effect$1: Factory<EffectFactoryFunction>;
55
+
56
+ declare function collector<T>(): Collector$1<T>;
59
57
  declare class Collector<T> implements Collector$1<T> {
60
- private values
61
- constructor(values: Set<T> | null)
62
- add(value: T): void
63
- collect(callback: () => void): Set<T>
58
+ private values;
59
+ constructor(values: Set<T> | null);
60
+ add(value: T): void;
61
+ collect(callback: () => void): Set<T>;
64
62
  }
65
63
 
66
- declare function computed<T>(compute: () => T, equals?: Equals<T>): Computed<T>
64
+ declare function computed<T>(compute: () => T, equals?: Equals<T>): Computed<T>;
67
65
  declare namespace computed {
68
- var collector: Factory<ComputedCollectorFactoryFunction>
69
- }
70
- interface ComputedCollectorFactoryFunction {
71
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>
66
+ var collector: Factory<ComputedCollectorFactoryFunction>;
72
67
  }
68
+ type ComputedCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
73
69
  declare class Computed<T> implements ReadonlySignal<T> {
74
- private empty
75
- private value
76
- private values
77
- private dependencies
78
- private readonly compute
79
- private readonly equalsFn
80
- private readonly listeners
81
- private readonly collector
82
- constructor(
83
- empty: boolean,
84
- value: T | undefined,
85
- values: unknown[],
86
- dependencies: Set<ReadonlySignal<unknown>>,
87
- listeners: Set<Callback>,
88
- collector: Collector$1<ReadonlySignal<unknown>>,
89
- compute: () => T,
90
- equals: Maybe<Equals<T>>,
91
- )
92
- private dirty
93
- read(): T
94
- equals(other: T): boolean
95
- subscribe(callback: Callback): Callback
96
- unsubscribe(callback: Callback): void
97
- }
98
-
99
- declare function composed<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Composed<T>
70
+ private empty;
71
+ private value;
72
+ private values;
73
+ private dependencies;
74
+ private readonly compute;
75
+ private readonly equalsFn;
76
+ private readonly listeners;
77
+ private readonly collector;
78
+ constructor(empty: boolean, value: T | undefined, values: unknown[], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, collector: Collector$1<ReadonlySignal<unknown>>, compute: () => T, equals: Maybe<Equals<T>>);
79
+ private dirty;
80
+ read(): T;
81
+ equals(other: T): boolean;
82
+ subscribe(callback: Callback): Callback;
83
+ unsubscribe(callback: Callback): void;
84
+ }
85
+
86
+ declare function composed<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Composed<T>;
100
87
  declare namespace composed {
101
- var collector: Factory<ComposedCollectorFactoryFunction>
102
- }
103
- interface ComposedCollectorFactoryFunction {
104
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>
88
+ var collector: Factory<ComposedCollectorFactoryFunction>;
105
89
  }
90
+ type ComposedCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
106
91
  declare class Composed<T> extends Computed<T> implements Signal$1<T> {
107
- private readonly writeFn
108
- constructor(
109
- empty: boolean,
110
- value: T | undefined,
111
- values: unknown[],
112
- dependencies: Set<ReadonlySignal<unknown>>,
113
- listeners: Set<Callback>,
114
- collector: Collector$1<ReadonlySignal<unknown>>,
115
- compute: () => T,
116
- write: (value: T) => void,
117
- equals: Maybe<Equals<T>>,
118
- )
119
- write(value: T): void
120
- }
121
-
122
- declare function signal<T>(value: T, equals?: Equals<T>): Signal$1<T>
123
- declare namespace signal {
124
- var collector: Factory<SignalCollectorFactoryFunction>
92
+ private readonly writeFn;
93
+ constructor(empty: boolean, value: T | undefined, values: unknown[], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, collector: Collector$1<ReadonlySignal<unknown>>, compute: () => T, write: (value: T) => void, equals: Maybe<Equals<T>>);
94
+ write(value: T): void;
125
95
  }
126
- interface SignalCollectorFactoryFunction {
127
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>
96
+
97
+ type EffectCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
98
+ declare function effect(cb: EffectCallback): Callback;
99
+ declare namespace effect {
100
+ var collector: Factory<EffectCollectorFactoryFunction>;
128
101
  }
102
+
103
+ declare function signal<T>(value: T, equals?: Equals<T>): Signal$1<T>;
104
+ declare namespace signal {
105
+ var collector: Factory<SignalCollectorFactoryFunction>;
106
+ }
107
+ type SignalCollectorFactoryFunction = () => Maybe<Collector$1<ReadonlySignal<unknown>>>;
129
108
  declare class Signal<T> implements Signal$1<T> {
130
- private value
131
- private equalsFn
132
- private listeners
133
- private collector
134
- constructor(value: T, equals: Maybe<Equals<T>>, listeners: Set<Callback>, collector: Maybe<Collector$1<ReadonlySignal<unknown>>>)
135
- read(): T
136
- write(value: T): void
137
- equals(other: T): boolean
138
- subscribe(callback: Callback): Callback
139
- unsubscribe(callback: Callback): void
140
- }
141
-
142
- type index_Collector<T> = Collector<T>
143
- declare const index_Collector: typeof Collector
144
- type index_Composed<T> = Composed<T>
145
- declare const index_Composed: typeof Composed
146
- type index_ComposedCollectorFactoryFunction = ComposedCollectorFactoryFunction
147
- type index_Computed<T> = Computed<T>
148
- declare const index_Computed: typeof Computed
149
- type index_ComputedCollectorFactoryFunction = ComputedCollectorFactoryFunction
150
- type index_Signal<T> = Signal<T>
151
- declare const index_Signal: typeof Signal
152
- type index_SignalCollectorFactoryFunction = SignalCollectorFactoryFunction
153
- declare const index_collector: typeof collector
154
- declare const index_composed: typeof composed
155
- declare const index_computed: typeof computed
156
- declare const index_signal: typeof signal
109
+ private value;
110
+ private equalsFn;
111
+ private listeners;
112
+ private collector;
113
+ constructor(value: T, equals: Maybe<Equals<T>>, listeners: Set<Callback>, collector: Maybe<Collector$1<ReadonlySignal<unknown>>>);
114
+ read(): T;
115
+ write(value: T): void;
116
+ equals(other: T): boolean;
117
+ subscribe(callback: Callback): Callback;
118
+ unsubscribe(callback: Callback): void;
119
+ }
120
+
121
+ type index_Collector<T> = Collector<T>;
122
+ declare const index_Collector: typeof Collector;
123
+ type index_Composed<T> = Composed<T>;
124
+ declare const index_Composed: typeof Composed;
125
+ type index_ComposedCollectorFactoryFunction = ComposedCollectorFactoryFunction;
126
+ type index_Computed<T> = Computed<T>;
127
+ declare const index_Computed: typeof Computed;
128
+ type index_ComputedCollectorFactoryFunction = ComputedCollectorFactoryFunction;
129
+ type index_EffectCollectorFactoryFunction = EffectCollectorFactoryFunction;
130
+ type index_Signal<T> = Signal<T>;
131
+ declare const index_Signal: typeof Signal;
132
+ type index_SignalCollectorFactoryFunction = SignalCollectorFactoryFunction;
133
+ declare const index_collector: typeof collector;
134
+ declare const index_composed: typeof composed;
135
+ declare const index_computed: typeof computed;
136
+ declare const index_effect: typeof effect;
137
+ declare const index_signal: typeof signal;
157
138
  declare namespace index {
158
- export {
159
- index_Collector as Collector,
160
- index_Composed as Composed,
161
- type index_ComposedCollectorFactoryFunction as ComposedCollectorFactoryFunction,
162
- index_Computed as Computed,
163
- type index_ComputedCollectorFactoryFunction as ComputedCollectorFactoryFunction,
164
- index_Signal as Signal,
165
- type index_SignalCollectorFactoryFunction as SignalCollectorFactoryFunction,
166
- index_collector as collector,
167
- index_composed as composed,
168
- index_computed as computed,
169
- index_signal as signal,
170
- }
139
+ export { index_Collector as Collector, index_Composed as Composed, type index_ComposedCollectorFactoryFunction as ComposedCollectorFactoryFunction, index_Computed as Computed, type index_ComputedCollectorFactoryFunction as ComputedCollectorFactoryFunction, type index_EffectCollectorFactoryFunction as EffectCollectorFactoryFunction, index_Signal as Signal, type index_SignalCollectorFactoryFunction as SignalCollectorFactoryFunction, index_collector as collector, index_composed as composed, index_computed as computed, index_effect as effect, index_signal as signal };
171
140
  }
172
141
 
142
+ type Arguments<T> = T extends (...args: infer A) => any ? A : never;
143
+
173
144
  interface Config {
174
- collector?: Maybe<CollectorFactoryFunction>
175
- signal?: Maybe<SignalFactoryFunction>
176
- computed?: Maybe<ComputedFactoryFunction>
177
- composed?: Maybe<ComposedFactoryFunction>
178
- }
179
- declare function config(config?: Config): void
180
-
181
- export {
182
- type Callback,
183
- type Collector$1 as Collector,
184
- type CollectorFactoryFunction,
185
- type Comparable,
186
- type ComposedFactoryFunction,
187
- type ComputedFactoryFunction,
188
- type Config,
189
- type Equals,
190
- type Maybe,
191
- type Reader,
192
- type ReadonlySignal,
193
- type Signal$1 as Signal,
194
- type SignalFactoryFunction,
195
- type Subscription,
196
- type Writer,
197
- collector$1 as collector,
198
- composed$1 as composed,
199
- computed$1 as computed,
200
- config,
201
- index as internal,
202
- signal$1 as signal,
145
+ collector?: Maybe<CollectorFactoryFunction>;
146
+ signal?: Maybe<SignalFactoryFunction>;
147
+ effect?: Maybe<EffectFactoryFunction>;
148
+ computed?: Maybe<ComputedFactoryFunction>;
149
+ composed?: Maybe<ComposedFactoryFunction>;
203
150
  }
151
+ declare function config(config?: Config): void;
152
+
153
+ export { type Arguments, type Callback, type Collector$1 as Collector, type CollectorFactoryFunction, type Comparable, type ComposedFactoryFunction, type ComputedFactoryFunction, type Config, type Effect, type EffectCallback, type EffectCleanup, type EffectFactoryFunction, type Equals, type Maybe, type Reader, type ReadonlySignal, type Signal$1 as Signal, type SignalFactoryFunction, type Subscription, type Writer, collector$1 as collector, composed$1 as composed, computed$1 as computed, config, effect$1 as effect, index as internal, signal$1 as signal };
package/dist/index.d.ts CHANGED
@@ -11,12 +11,7 @@ interface Collector$1<T> {
11
11
  add(value: T): void;
12
12
  collect(callback: () => void): Readonly<Set<T>>;
13
13
  }
14
- interface CollectorFactoryFunction {
15
- <T>(): Collector$1<T>;
16
- }
17
- type collector_type = typeof collector$1;
18
- interface collector$1 extends collector_type {
19
- }
14
+ type CollectorFactoryFunction = <T>() => Collector$1<T>;
20
15
  declare const collector$1: Factory<CollectorFactoryFunction>;
21
16
 
22
17
  type Equals<T> = (value: T, other: T) => boolean;
@@ -43,21 +38,21 @@ interface Signal$1<T> extends Reader<T>, Writer<T>, Comparable<T>, Subscription
43
38
  }
44
39
  interface ReadonlySignal<T> extends Reader<T>, Comparable<T>, Subscription {
45
40
  }
46
- interface SignalFactoryFunction {
47
- <T>(value: T, equals?: Equals<T>): Signal$1<T>;
48
- }
41
+ type SignalFactoryFunction = <T>(value: T, equals?: Equals<T>) => Signal$1<T>;
49
42
  declare const signal$1: Factory<SignalFactoryFunction>;
50
43
 
51
- interface ComposedFactoryFunction {
52
- <T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Signal$1<T>;
53
- }
44
+ type ComposedFactoryFunction = <T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>) => Signal$1<T>;
54
45
  declare const composed$1: Factory<ComposedFactoryFunction>;
55
46
 
56
- interface ComputedFactoryFunction {
57
- <T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>;
58
- }
47
+ type ComputedFactoryFunction = <T>(compute: () => T, equals?: Equals<T>) => ReadonlySignal<T>;
59
48
  declare const computed$1: Factory<ComputedFactoryFunction>;
60
49
 
50
+ type Effect = () => void;
51
+ type EffectCallback = (init: boolean) => EffectCleanup | void;
52
+ type EffectCleanup = (destroy: boolean) => void;
53
+ type EffectFactoryFunction = (callback: EffectCallback) => Effect;
54
+ declare const effect$1: Factory<EffectFactoryFunction>;
55
+
61
56
  declare function collector<T>(): Collector$1<T>;
62
57
  declare class Collector<T> implements Collector$1<T> {
63
58
  private values;
@@ -70,9 +65,7 @@ declare function computed<T>(compute: () => T, equals?: Equals<T>): Computed<T>;
70
65
  declare namespace computed {
71
66
  var collector: Factory<ComputedCollectorFactoryFunction>;
72
67
  }
73
- interface ComputedCollectorFactoryFunction {
74
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>;
75
- }
68
+ type ComputedCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
76
69
  declare class Computed<T> implements ReadonlySignal<T> {
77
70
  private empty;
78
71
  private value;
@@ -94,22 +87,24 @@ declare function composed<T>(compute: () => T, write: (value: T) => void, equals
94
87
  declare namespace composed {
95
88
  var collector: Factory<ComposedCollectorFactoryFunction>;
96
89
  }
97
- interface ComposedCollectorFactoryFunction {
98
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>;
99
- }
90
+ type ComposedCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
100
91
  declare class Composed<T> extends Computed<T> implements Signal$1<T> {
101
92
  private readonly writeFn;
102
93
  constructor(empty: boolean, value: T | undefined, values: unknown[], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, collector: Collector$1<ReadonlySignal<unknown>>, compute: () => T, write: (value: T) => void, equals: Maybe<Equals<T>>);
103
94
  write(value: T): void;
104
95
  }
105
96
 
97
+ type EffectCollectorFactoryFunction = () => Collector$1<ReadonlySignal<unknown>>;
98
+ declare function effect(cb: EffectCallback): Callback;
99
+ declare namespace effect {
100
+ var collector: Factory<EffectCollectorFactoryFunction>;
101
+ }
102
+
106
103
  declare function signal<T>(value: T, equals?: Equals<T>): Signal$1<T>;
107
104
  declare namespace signal {
108
105
  var collector: Factory<SignalCollectorFactoryFunction>;
109
106
  }
110
- interface SignalCollectorFactoryFunction {
111
- (): Maybe<Collector$1<ReadonlySignal<unknown>>>;
112
- }
107
+ type SignalCollectorFactoryFunction = () => Maybe<Collector$1<ReadonlySignal<unknown>>>;
113
108
  declare class Signal<T> implements Signal$1<T> {
114
109
  private value;
115
110
  private equalsFn;
@@ -131,23 +126,28 @@ type index_ComposedCollectorFactoryFunction = ComposedCollectorFactoryFunction;
131
126
  type index_Computed<T> = Computed<T>;
132
127
  declare const index_Computed: typeof Computed;
133
128
  type index_ComputedCollectorFactoryFunction = ComputedCollectorFactoryFunction;
129
+ type index_EffectCollectorFactoryFunction = EffectCollectorFactoryFunction;
134
130
  type index_Signal<T> = Signal<T>;
135
131
  declare const index_Signal: typeof Signal;
136
132
  type index_SignalCollectorFactoryFunction = SignalCollectorFactoryFunction;
137
133
  declare const index_collector: typeof collector;
138
134
  declare const index_composed: typeof composed;
139
135
  declare const index_computed: typeof computed;
136
+ declare const index_effect: typeof effect;
140
137
  declare const index_signal: typeof signal;
141
138
  declare namespace index {
142
- export { index_Collector as Collector, index_Composed as Composed, type index_ComposedCollectorFactoryFunction as ComposedCollectorFactoryFunction, index_Computed as Computed, type index_ComputedCollectorFactoryFunction as ComputedCollectorFactoryFunction, index_Signal as Signal, type index_SignalCollectorFactoryFunction as SignalCollectorFactoryFunction, index_collector as collector, index_composed as composed, index_computed as computed, index_signal as signal };
139
+ export { index_Collector as Collector, index_Composed as Composed, type index_ComposedCollectorFactoryFunction as ComposedCollectorFactoryFunction, index_Computed as Computed, type index_ComputedCollectorFactoryFunction as ComputedCollectorFactoryFunction, type index_EffectCollectorFactoryFunction as EffectCollectorFactoryFunction, index_Signal as Signal, type index_SignalCollectorFactoryFunction as SignalCollectorFactoryFunction, index_collector as collector, index_composed as composed, index_computed as computed, index_effect as effect, index_signal as signal };
143
140
  }
144
141
 
142
+ type Arguments<T> = T extends (...args: infer A) => any ? A : never;
143
+
145
144
  interface Config {
146
145
  collector?: Maybe<CollectorFactoryFunction>;
147
146
  signal?: Maybe<SignalFactoryFunction>;
147
+ effect?: Maybe<EffectFactoryFunction>;
148
148
  computed?: Maybe<ComputedFactoryFunction>;
149
149
  composed?: Maybe<ComposedFactoryFunction>;
150
150
  }
151
151
  declare function config(config?: Config): void;
152
152
 
153
- export { type Callback, type Collector$1 as Collector, type CollectorFactoryFunction, type Comparable, type ComposedFactoryFunction, type ComputedFactoryFunction, type Config, type Equals, type Maybe, type Reader, type ReadonlySignal, type Signal$1 as Signal, type SignalFactoryFunction, type Subscription, type Writer, collector$1 as collector, composed$1 as composed, computed$1 as computed, config, index as internal, signal$1 as signal };
153
+ export { type Arguments, type Callback, type Collector$1 as Collector, type CollectorFactoryFunction, type Comparable, type ComposedFactoryFunction, type ComputedFactoryFunction, type Config, type Effect, type EffectCallback, type EffectCleanup, type EffectFactoryFunction, type Equals, type Maybe, type Reader, type ReadonlySignal, type Signal$1 as Signal, type SignalFactoryFunction, type Subscription, type Writer, collector$1 as collector, composed$1 as composed, computed$1 as computed, config, effect$1 as effect, index as internal, signal$1 as signal };
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ __export(index_exports, {
24
24
  composed: () => composed,
25
25
  computed: () => computed,
26
26
  config: () => config,
27
+ effect: () => effect,
27
28
  internal: () => internal_exports,
28
29
  signal: () => signal
29
30
  });
@@ -57,6 +58,9 @@ var composed = factory("composed");
57
58
  // src/core/computed.ts
58
59
  var computed = factory("computed");
59
60
 
61
+ // src/core/effect.ts
62
+ var effect = factory("effect");
63
+
60
64
  // src/core/signal.ts
61
65
  var signal = factory("signal");
62
66
 
@@ -70,6 +74,7 @@ __export(internal_exports, {
70
74
  collector: () => collector2,
71
75
  composed: () => composed2,
72
76
  computed: () => computed2,
77
+ effect: () => effect2,
73
78
  signal: () => signal2
74
79
  });
75
80
 
@@ -98,9 +103,6 @@ var Collector = class {
98
103
 
99
104
  // src/internal/computed.ts
100
105
  function computed2(compute, equals) {
101
- if (!computed2.collector()) {
102
- throw new Error("computed: collector is not configured.");
103
- }
104
106
  return new Computed(
105
107
  true,
106
108
  void 0,
@@ -134,28 +136,20 @@ var Computed = class {
134
136
  }
135
137
  dirty() {
136
138
  if (this.empty) return true;
137
- return Array.from(this.dependencies).some((dependency, index) => !dependency.equals(this.values[index]));
139
+ return Array.from(this.dependencies).some((dep, index) => !dep.equals(this.values[index]));
138
140
  }
139
141
  read() {
140
142
  this.collector.add(this);
141
143
  if (!this.dirty()) return this.value;
142
144
  const current = this.dependencies;
143
- const next = this.collector.collect(() => {
144
- this.value = this.compute();
145
- });
145
+ const next = this.collector.collect(() => this.value = this.compute());
146
146
  this.dependencies = next;
147
- this.values = Array.from(this.dependencies).map((dependency) => dependency.read());
147
+ this.values = Array.from(next).map((dep) => dep.read());
148
148
  this.empty = false;
149
149
  if (!current.size && !next.size) return this.value;
150
150
  if (!this.listeners.size) return this.value;
151
- current.forEach((dependency) => {
152
- if (next.has(dependency)) return;
153
- this.listeners.forEach((listener) => dependency.unsubscribe(listener));
154
- });
155
- next.forEach((dependency) => {
156
- if (current.has(dependency)) return;
157
- this.listeners.forEach((listener) => dependency.subscribe(listener));
158
- });
151
+ current.forEach((dep) => !next.has(dep) && this.listeners.forEach((listener) => dep.unsubscribe(listener)));
152
+ next.forEach((dep) => !current.has(dep) && this.listeners.forEach((listener) => dep.subscribe(listener)));
159
153
  return this.value;
160
154
  }
161
155
  equals(other) {
@@ -164,20 +158,17 @@ var Computed = class {
164
158
  }
165
159
  subscribe(callback) {
166
160
  this.listeners.add(callback);
167
- this.dependencies.forEach((dependency) => dependency.subscribe(callback));
161
+ this.dependencies.forEach((dep) => dep.subscribe(callback));
168
162
  return () => this.unsubscribe(callback);
169
163
  }
170
164
  unsubscribe(callback) {
171
165
  this.listeners.delete(callback);
172
- this.dependencies.forEach((dependency) => dependency.unsubscribe(callback));
166
+ this.dependencies.forEach((dep) => dep.unsubscribe(callback));
173
167
  }
174
168
  };
175
169
 
176
170
  // src/internal/composed.ts
177
171
  function composed2(compute, write, equals) {
178
- if (!composed2.collector()) {
179
- throw new Error("composed: collector is not configured.");
180
- }
181
172
  return new Composed(
182
173
  true,
183
174
  void 0,
@@ -203,6 +194,27 @@ var Composed = class extends Computed {
203
194
  }
204
195
  };
205
196
 
197
+ // src/internal/effect.ts
198
+ function effect2(cb) {
199
+ let cleanupFn = null;
200
+ let dependencies = effect2.collector().collect(() => cleanupFn = cb(true) ?? null);
201
+ dependencies.forEach((dependency) => dependency.subscribe(callback));
202
+ function callback() {
203
+ if (cleanupFn) cleanupFn(false);
204
+ const next = effect2.collector().collect(() => cleanupFn = cb(false) ?? null);
205
+ next.forEach((dependency) => !dependencies.has(dependency) && dependency.subscribe(callback));
206
+ dependencies.forEach((dependency) => !next.has(dependency) && dependency.unsubscribe(callback));
207
+ dependencies = next;
208
+ }
209
+ return () => {
210
+ dependencies.forEach((dependency) => dependency.unsubscribe(callback));
211
+ dependencies.clear();
212
+ if (cleanupFn) cleanupFn(true);
213
+ cleanupFn = null;
214
+ };
215
+ }
216
+ effect2.collector = factory("effect.collector");
217
+
206
218
  // src/internal/signal.ts
207
219
  function signal2(value, equals) {
208
220
  return new Signal(value, equals, /* @__PURE__ */ new Set(), signal2.collector());
@@ -243,8 +255,9 @@ var Signal = class {
243
255
 
244
256
  // src/index.ts
245
257
  function config(config2 = {}) {
246
- signal.factory(config2.signal);
247
258
  collector.factory(config2.collector);
259
+ signal.factory(config2.signal);
260
+ effect.factory(config2.effect);
248
261
  computed.factory(config2.computed);
249
262
  composed.factory(config2.composed);
250
263
  }
@@ -254,9 +267,11 @@ function shared() {
254
267
  return __shared__;
255
268
  }
256
269
  signal2.collector.default(shared);
270
+ effect2.collector.default(shared);
257
271
  computed2.collector.default(shared);
258
272
  composed2.collector.default(shared);
259
273
  signal.default(signal2);
274
+ effect.default(effect2);
260
275
  collector.default(collector2);
261
276
  computed.default(computed2);
262
277
  composed.default(composed2);
@@ -266,6 +281,7 @@ composed.default(composed2);
266
281
  composed,
267
282
  computed,
268
283
  config,
284
+ effect,
269
285
  internal,
270
286
  signal
271
287
  });
package/dist/index.mjs CHANGED
@@ -32,6 +32,9 @@ var composed = factory("composed");
32
32
  // src/core/computed.ts
33
33
  var computed = factory("computed");
34
34
 
35
+ // src/core/effect.ts
36
+ var effect = factory("effect");
37
+
35
38
  // src/core/signal.ts
36
39
  var signal = factory("signal");
37
40
 
@@ -45,6 +48,7 @@ __export(internal_exports, {
45
48
  collector: () => collector2,
46
49
  composed: () => composed2,
47
50
  computed: () => computed2,
51
+ effect: () => effect2,
48
52
  signal: () => signal2
49
53
  });
50
54
 
@@ -73,9 +77,6 @@ var Collector = class {
73
77
 
74
78
  // src/internal/computed.ts
75
79
  function computed2(compute, equals) {
76
- if (!computed2.collector()) {
77
- throw new Error("computed: collector is not configured.");
78
- }
79
80
  return new Computed(
80
81
  true,
81
82
  void 0,
@@ -109,28 +110,20 @@ var Computed = class {
109
110
  }
110
111
  dirty() {
111
112
  if (this.empty) return true;
112
- return Array.from(this.dependencies).some((dependency, index) => !dependency.equals(this.values[index]));
113
+ return Array.from(this.dependencies).some((dep, index) => !dep.equals(this.values[index]));
113
114
  }
114
115
  read() {
115
116
  this.collector.add(this);
116
117
  if (!this.dirty()) return this.value;
117
118
  const current = this.dependencies;
118
- const next = this.collector.collect(() => {
119
- this.value = this.compute();
120
- });
119
+ const next = this.collector.collect(() => this.value = this.compute());
121
120
  this.dependencies = next;
122
- this.values = Array.from(this.dependencies).map((dependency) => dependency.read());
121
+ this.values = Array.from(next).map((dep) => dep.read());
123
122
  this.empty = false;
124
123
  if (!current.size && !next.size) return this.value;
125
124
  if (!this.listeners.size) return this.value;
126
- current.forEach((dependency) => {
127
- if (next.has(dependency)) return;
128
- this.listeners.forEach((listener) => dependency.unsubscribe(listener));
129
- });
130
- next.forEach((dependency) => {
131
- if (current.has(dependency)) return;
132
- this.listeners.forEach((listener) => dependency.subscribe(listener));
133
- });
125
+ current.forEach((dep) => !next.has(dep) && this.listeners.forEach((listener) => dep.unsubscribe(listener)));
126
+ next.forEach((dep) => !current.has(dep) && this.listeners.forEach((listener) => dep.subscribe(listener)));
134
127
  return this.value;
135
128
  }
136
129
  equals(other) {
@@ -139,20 +132,17 @@ var Computed = class {
139
132
  }
140
133
  subscribe(callback) {
141
134
  this.listeners.add(callback);
142
- this.dependencies.forEach((dependency) => dependency.subscribe(callback));
135
+ this.dependencies.forEach((dep) => dep.subscribe(callback));
143
136
  return () => this.unsubscribe(callback);
144
137
  }
145
138
  unsubscribe(callback) {
146
139
  this.listeners.delete(callback);
147
- this.dependencies.forEach((dependency) => dependency.unsubscribe(callback));
140
+ this.dependencies.forEach((dep) => dep.unsubscribe(callback));
148
141
  }
149
142
  };
150
143
 
151
144
  // src/internal/composed.ts
152
145
  function composed2(compute, write, equals) {
153
- if (!composed2.collector()) {
154
- throw new Error("composed: collector is not configured.");
155
- }
156
146
  return new Composed(
157
147
  true,
158
148
  void 0,
@@ -178,6 +168,27 @@ var Composed = class extends Computed {
178
168
  }
179
169
  };
180
170
 
171
+ // src/internal/effect.ts
172
+ function effect2(cb) {
173
+ let cleanupFn = null;
174
+ let dependencies = effect2.collector().collect(() => cleanupFn = cb(true) ?? null);
175
+ dependencies.forEach((dependency) => dependency.subscribe(callback));
176
+ function callback() {
177
+ if (cleanupFn) cleanupFn(false);
178
+ const next = effect2.collector().collect(() => cleanupFn = cb(false) ?? null);
179
+ next.forEach((dependency) => !dependencies.has(dependency) && dependency.subscribe(callback));
180
+ dependencies.forEach((dependency) => !next.has(dependency) && dependency.unsubscribe(callback));
181
+ dependencies = next;
182
+ }
183
+ return () => {
184
+ dependencies.forEach((dependency) => dependency.unsubscribe(callback));
185
+ dependencies.clear();
186
+ if (cleanupFn) cleanupFn(true);
187
+ cleanupFn = null;
188
+ };
189
+ }
190
+ effect2.collector = factory("effect.collector");
191
+
181
192
  // src/internal/signal.ts
182
193
  function signal2(value, equals) {
183
194
  return new Signal(value, equals, /* @__PURE__ */ new Set(), signal2.collector());
@@ -218,8 +229,9 @@ var Signal = class {
218
229
 
219
230
  // src/index.ts
220
231
  function config(config2 = {}) {
221
- signal.factory(config2.signal);
222
232
  collector.factory(config2.collector);
233
+ signal.factory(config2.signal);
234
+ effect.factory(config2.effect);
223
235
  computed.factory(config2.computed);
224
236
  composed.factory(config2.composed);
225
237
  }
@@ -229,9 +241,11 @@ function shared() {
229
241
  return __shared__;
230
242
  }
231
243
  signal2.collector.default(shared);
244
+ effect2.collector.default(shared);
232
245
  computed2.collector.default(shared);
233
246
  composed2.collector.default(shared);
234
247
  signal.default(signal2);
248
+ effect.default(effect2);
235
249
  collector.default(collector2);
236
250
  computed.default(computed2);
237
251
  composed.default(composed2);
@@ -240,6 +254,7 @@ export {
240
254
  composed,
241
255
  computed,
242
256
  config,
257
+ effect,
243
258
  internal_exports as internal,
244
259
  signal
245
260
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valentin30/signal",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,6 +11,7 @@
11
11
  "scripts": {
12
12
  "clean": "rimraf dist",
13
13
  "build": "npm run clean && tsup",
14
+ "publish": "npm run build && npm publish --access public",
14
15
  "dev": "tsup --watch",
15
16
  "test": "vitest run",
16
17
  "test:watch": "vitest"