@valentin30/signal 0.0.9 → 0.2.0

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,201 +1,287 @@
1
- type Callable = (...args: any[]) => any;
1
+ type Callable<Args extends any[] = any[], ReturnType = any> = (...args: Args) => ReturnType;
2
2
 
3
- type Maybe<T> = T | null | undefined;
4
-
5
- type Factory<Fn extends Callable> = Fn & {
6
- factory(factory: Maybe<Fn>): void;
7
- default(factory: Maybe<Fn>): void;
8
- configured(): boolean;
9
- };
10
- declare function factory<Fn extends Callable>(name: string): Factory<Fn>;
11
-
12
- type Callback = () => void;
13
-
14
- interface Collector$1<T> {
15
- add(value: T): void;
16
- collecting(): boolean;
17
- collect(callback: Callback): Readonly<Set<T>>;
18
- ignore(callback: Callback): void;
3
+ interface Batcher {
4
+ batch<Value>(callback: () => Value): Value;
5
+ batch<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
19
6
  }
20
- type CollectorFactory = <T>() => Collector$1<T>;
21
- declare const collector$1: Factory<CollectorFactory>;
7
+ declare function batch<Value>(callback: () => Value): Value;
8
+ declare function batch<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
22
9
 
23
- declare function batch$1(callback: Callback): void;
24
- declare function batch$1(callback: Callback, collector: Collector$1<Callback>): void;
25
- declare function batch$1(callback: Callback, collector?: Collector$1<Callback>): void;
26
- declare namespace batch$1 {
27
- var collector: Factory<BatchCollectorFactory>;
10
+ type Write<T> = (value: T) => void | undefined | boolean;
11
+ interface Writable<T> {
12
+ write(value: T): boolean;
28
13
  }
29
- type BatchCollectorFactory = () => Collector$1<Callback>;
14
+ declare function writer<T>(write: Write<T>): Writable<T>;
30
15
 
31
- declare function collector<T>(): Collector$1<T>;
32
- declare class Collector<T> implements Collector$1<T> {
33
- #private;
34
- constructor(values: Set<T> | null);
35
- collecting(): boolean;
36
- add(value: T): void;
37
- collect(callback: Callback): Set<T>;
38
- ignore(callback: Callback): void;
16
+ interface Comparator<T> {
17
+ equals(value: T, other: T): boolean;
39
18
  }
40
-
41
- interface Comparable<T> {
19
+ interface Comparable<T> extends Comparator<T> {
42
20
  equals(other: T): boolean;
21
+ equals(value: T, other: T): boolean;
22
+ }
23
+ type Equals<T> = (value: T, other: T) => boolean;
24
+ declare namespace Equals {
25
+ function strict<T>(value: T, other: T): boolean;
26
+ }
27
+ declare function comparator<T>(equals?: Equals<T>): Comparator<T>;
28
+
29
+ interface Peekable<T> {
30
+ peek(): T;
43
31
  }
44
32
 
45
33
  interface Readable<T> {
46
34
  read(): T;
47
35
  }
36
+ declare function reader<T>(read: () => T): Readable<T>;
37
+
38
+ type Callback = () => void;
48
39
 
49
40
  interface Subscribable {
50
41
  subscribe(callback: Callback): Callback;
51
42
  unsubscribe(callback: Callback): void;
52
43
  }
53
44
 
54
- interface Writable<T> {
55
- write(value: T): void;
45
+ interface Signal<T> extends Readable<T>, Writable<T>, Comparable<T>, Peekable<T>, Subscribable {
46
+ }
47
+ interface ReadonlySignal<T> extends Readable<T>, Comparable<T>, Peekable<T>, Subscribable {
56
48
  }
49
+ interface SignalFactory {
50
+ <T>(value: T, equals?: Equals<T>): Signal<T>;
51
+ }
52
+ declare function signal<T>(value: T, equals?: Equals<T>): Signal<T>;
57
53
 
58
- type Equals<T> = (value: T, other: T) => boolean;
54
+ interface ComposedFactory {
55
+ <T>(value: ReadonlySignal<T>, write: Write<T>): Signal<T>;
56
+ }
57
+ declare function composed<T>(value: ReadonlySignal<T>, write: Write<T>): Signal<T>;
59
58
 
60
- interface Peekable<T> {
61
- peek(): T;
59
+ interface ComputedFactory {
60
+ <T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>;
61
+ }
62
+ declare function computed<T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>;
63
+
64
+ interface Ignore {
65
+ ignore<Value>(callback: () => Value): Value;
66
+ ignore<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
67
+ }
68
+ declare function ignore<Value>(callback: () => Value): Value;
69
+ declare function ignore<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
70
+
71
+ interface CollectorState {
72
+ collecting(): boolean;
73
+ }
74
+ interface CollectorTarget<T> extends CollectorState {
75
+ add(value: T): void;
76
+ }
77
+ interface Collector<T> extends CollectorState {
78
+ collect<Value>(callback: () => Value): [Value, Readonly<Set<T>>];
79
+ collect<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): [Value, Readonly<Set<T>>];
80
+ }
81
+
82
+ interface Tracker<T> {
83
+ track(value: T): void;
84
+ }
85
+
86
+ interface DependencyState {
87
+ changed(): boolean;
88
+ }
89
+ interface DependencyObserver extends DependencyState, Tracker<Callback> {
90
+ }
91
+ interface DependencyTracker extends DependencyObserver, Subscribable {
62
92
  }
63
93
 
64
- interface Signal$1<T> extends Readable<T>, Writable<T>, Peekable<T>, Comparable<T>, Subscribable {
94
+ interface Scheduler<T> {
95
+ schedule(...value: T[]): void;
65
96
  }
66
- interface ReadonlySignal<T> extends Readable<T>, Peekable<T>, Comparable<T>, Subscribable {
97
+
98
+ declare class CollectorBasedBatcher implements Batcher {
99
+ private readonly collector;
100
+ constructor(collector: Collector<Callback>);
101
+ batch<Value>(callback: () => Value): Value;
102
+ batch<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
67
103
  }
68
- type SignalFactory = <T>(value: T, equals?: Equals<T>) => Signal$1<T>;
69
- declare const signal$1: Factory<SignalFactory>;
70
104
 
71
- declare function computed$1<T>(compute: () => T, equals?: Equals<T>): Computed<T>;
72
- declare namespace computed$1 {
73
- var collector: Factory<ComputedCollectorFactory>;
105
+ type Maybe<T> = T | null | undefined;
106
+
107
+ declare class CollectorController<T> implements Collector<T>, CollectorTarget<T>, CollectorState, Ignore, Tracker<T> {
108
+ private values;
109
+ constructor(values?: Maybe<Set<T>>);
110
+ collecting(): boolean;
111
+ add(value: T): void;
112
+ track(value: T): void;
113
+ collect<Value>(callback: () => Value): [Value, Readonly<Set<T>>];
114
+ collect<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): [Value, Readonly<Set<T>>];
115
+ ignore<Value>(callback: () => Value): Value;
116
+ ignore<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
74
117
  }
75
- type ComputedCollectorFactory = () => Collector$1<ReadonlySignal<unknown>>;
76
- declare class Computed<T> implements ReadonlySignal<T> {
77
- #private;
78
- constructor(empty: boolean, value: T | undefined, values: [ReadonlySignal<unknown>, unknown][], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, collector: Collector$1<ReadonlySignal<unknown>>, compute: () => T, equals: Maybe<Equals<T>>);
118
+
119
+ declare class Composed<T> implements Signal<T> {
120
+ private readonly value;
121
+ private readonly writer;
122
+ constructor(value: ReadonlySignal<T>, writer: Writable<T>);
79
123
  read(): T;
80
124
  peek(): T;
125
+ write(value: T): boolean;
81
126
  equals(other: T): boolean;
127
+ equals(value: T, other: T): boolean;
82
128
  subscribe(callback: Callback): Callback;
83
129
  unsubscribe(callback: Callback): void;
84
130
  }
85
131
 
86
- type ComposedBatcherFactory = () => Collector$1<Callback>;
87
- type ComposedCollectorFactory = () => Collector$1<ReadonlySignal<unknown>>;
88
- declare function composed$1<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Composed<T>;
89
- declare namespace composed$1 {
90
- var batcher: Factory<ComposedBatcherFactory>;
91
- var collector: Factory<ComposedCollectorFactory>;
132
+ type Snapshot = [ReadonlySignal<unknown>, unknown];
133
+ declare namespace Snapshot {
134
+ function changed([value, snapshot]: Snapshot): boolean;
135
+ function from(values: Set<ReadonlySignal<unknown>>): Snapshot[];
92
136
  }
93
- declare class Composed<T> extends Computed<T> implements Signal$1<T> {
94
- #private;
95
- constructor(empty: boolean, value: T | undefined, values: [ReadonlySignal<unknown>, unknown][], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, batcher: Collector$1<Callback>, collector: Collector$1<ReadonlySignal<unknown>>, compute: () => T, write: (value: T) => void, equals: Maybe<Equals<T>>);
96
- write(value: T): void;
137
+ declare class DependencyManager implements DependencyTracker {
138
+ private snapshot;
139
+ private dependencies;
140
+ private readonly collector;
141
+ private readonly listeners;
142
+ constructor(collector: Collector<ReadonlySignal<unknown>>, listeners?: Set<Callback>, dependencies?: Set<ReadonlySignal<unknown>>, snapshot?: Maybe<Snapshot[]>);
143
+ changed(): boolean;
144
+ track(callback: Callback): void;
145
+ subscribe(callback: Callback): Callback;
146
+ unsubscribe(callback: Callback): void;
147
+ private equals;
97
148
  }
98
149
 
99
- type Effect = (callback: EffectCallback) => Callback;
100
- type EffectCallback = (init: boolean) => EffectCleanup | void;
101
- type EffectCleanup = (destroy: boolean) => void;
102
- declare const effect$1: Factory<Effect>;
103
-
104
- declare function effect(cb: EffectCallback): Callback;
105
- declare namespace effect {
106
- var collector: Factory<EffectCollectorFactory>;
150
+ interface Emitter {
151
+ emit(): void;
107
152
  }
108
- type EffectCollectorFactory = () => Collector$1<ReadonlySignal<unknown>>;
109
153
 
110
- interface Ignore$1 {
111
- <Value>(value: ReadonlySignal<Value>): Value;
112
- <Value>(callback: () => Value): Value;
113
- <Value, Args extends any[]>(callback: (...args: Args) => Value, ...args: Args): Value;
114
- }
115
- declare function ignore$1<Value>(value: ReadonlySignal<Value>): Value;
116
- declare function ignore$1<Value>(callback: () => Value): Value;
117
- declare function ignore$1<Value, Args extends any[]>(callback: (...args: Args) => Value, ...args: Args): Value;
118
- declare namespace ignore$1 {
119
- var collector: Factory<IgnoreCollectorFactory>;
154
+ declare class ScheduledEmitter implements Emitter, Subscribable {
155
+ private readonly listeners;
156
+ private readonly scheduler;
157
+ constructor(scheduler: Scheduler<Callback>, listeners?: Set<Callback>);
158
+ emit(): void;
159
+ subscribe(callback: Callback): Callback;
160
+ unsubscribe(callback: Callback): void;
120
161
  }
121
- type IgnoreCollectorFactory = () => Collector$1<ReadonlySignal<unknown>>;
122
162
 
123
- declare const shared: {
124
- batcher(): Collector$1<Callback>;
125
- collector(): Collector$1<ReadonlySignal<unknown>>;
126
- };
127
-
128
- type SignalBatcherFactory = () => Collector$1<Callback>;
129
- type SignalCollectorFactory = () => Collector$1<ReadonlySignal<unknown>>;
130
- declare function signal<T>(value: T, equals?: Equals<T>): Signal$1<T>;
131
- declare namespace signal {
132
- var batcher: Factory<SignalBatcherFactory>;
133
- var collector: Factory<SignalCollectorFactory>;
163
+ interface Value<T> extends Readable<T>, Writable<T>, Comparable<T> {
134
164
  }
135
- declare class Signal<T> implements Signal$1<T> {
136
- #private;
137
- constructor(value: T, equals: Maybe<Equals<T>>, listeners: Set<Callback>, batcher: Collector$1<Callback>, collector: Collector$1<ReadonlySignal<unknown>>);
165
+
166
+ declare class Reactive<T> implements Signal<T> {
167
+ private readonly value;
168
+ private readonly tracker;
169
+ private readonly subscription;
170
+ constructor(value: Value<T>, tracker: Tracker<ReadonlySignal<unknown>>, subscription: Subscribable);
138
171
  read(): T;
139
172
  peek(): T;
140
- write(value: T): void;
173
+ write(value: T): boolean;
141
174
  equals(other: T): boolean;
175
+ equals(value: T, other: T): boolean;
142
176
  subscribe(callback: Callback): Callback;
143
177
  unsubscribe(callback: Callback): void;
144
178
  }
145
179
 
146
- type index_BatchCollectorFactory = BatchCollectorFactory;
147
- type index_Collector<T> = Collector<T>;
148
- declare const index_Collector: typeof Collector;
149
- type index_Composed<T> = Composed<T>;
150
- declare const index_Composed: typeof Composed;
151
- type index_ComposedBatcherFactory = ComposedBatcherFactory;
152
- type index_ComposedCollectorFactory = ComposedCollectorFactory;
153
- type index_Computed<T> = Computed<T>;
154
- declare const index_Computed: typeof Computed;
155
- type index_ComputedCollectorFactory = ComputedCollectorFactory;
156
- type index_EffectCollectorFactory = EffectCollectorFactory;
157
- type index_IgnoreCollectorFactory = IgnoreCollectorFactory;
158
- type index_Signal<T> = Signal<T>;
159
- declare const index_Signal: typeof Signal;
160
- type index_SignalBatcherFactory = SignalBatcherFactory;
161
- type index_SignalCollectorFactory = SignalCollectorFactory;
162
- declare const index_collector: typeof collector;
163
- declare const index_effect: typeof effect;
164
- declare const index_shared: typeof shared;
165
- declare const index_signal: typeof signal;
166
- declare namespace index {
167
- export { type index_BatchCollectorFactory as BatchCollectorFactory, index_Collector as Collector, index_Composed as Composed, type index_ComposedBatcherFactory as ComposedBatcherFactory, type index_ComposedCollectorFactory as ComposedCollectorFactory, index_Computed as Computed, type index_ComputedCollectorFactory as ComputedCollectorFactory, type index_EffectCollectorFactory as EffectCollectorFactory, type Ignore$1 as Ignore, type index_IgnoreCollectorFactory as IgnoreCollectorFactory, index_Signal as Signal, type index_SignalBatcherFactory as SignalBatcherFactory, type index_SignalCollectorFactory as SignalCollectorFactory, batch$1 as batch, index_collector as collector, composed$1 as composed, computed$1 as computed, index_effect as effect, ignore$1 as ignore, index_shared as shared, index_signal as signal };
168
- }
169
-
170
- interface Batch {
171
- (callback: Callback): void;
172
- (callback: Callback, collector: Collector$1<Callback>): void;
173
- (callback: Callback, collector?: Collector$1<Callback>): void;
174
- }
175
- declare const batch: Factory<Batch>;
176
-
177
- type ComposedFactory = <T>(read: () => T, write: (value: T) => void, equals?: Equals<T>) => Signal$1<T>;
178
- declare const composed: Factory<ComposedFactory>;
179
-
180
- type ComputedFactory = <T>(read: () => T, equals?: Equals<T>) => ReadonlySignal<T>;
181
- declare const computed: Factory<ComputedFactory>;
180
+ declare class CallbackScheduler implements Scheduler<Callback> {
181
+ private readonly collector;
182
+ private readonly add;
183
+ constructor(collector: CollectorTarget<Callback>);
184
+ schedule(...args: Callback[]): void;
185
+ }
182
186
 
183
- interface Ignore {
184
- <Value>(value: ReadonlySignal<Value>): Value;
185
- <Value>(callback: () => Value): Value;
186
- <Value, Args extends any[]>(callback: (...args: Args) => Value, ...args: Args): Value;
187
+ declare class BasicValue<T> implements Value<T> {
188
+ private value;
189
+ private readonly comparator;
190
+ constructor(value: T, comparator: Comparator<T>);
191
+ read(): T;
192
+ write(value: T): boolean;
193
+ equals(other: T): boolean;
194
+ equals(value: T, other: T): boolean;
195
+ }
196
+ declare class EmittingValue<T> {
197
+ private readonly value;
198
+ private readonly emitter;
199
+ constructor(value: Value<T>, emitter: Emitter);
200
+ read(): T;
201
+ write(value: T): boolean;
202
+ equals(other: T): boolean;
203
+ equals(value: T, other: T): boolean;
204
+ }
205
+ declare class ComputedValue<T> implements Value<T> {
206
+ private readonly cache;
207
+ private readonly computation;
208
+ private readonly dependencies;
209
+ constructor(cache: Value<T>, computation: Readable<T>, dependencies: DependencyObserver);
210
+ read(): T;
211
+ private recompute;
212
+ write(_: T): boolean;
213
+ equals(other: T): boolean;
214
+ equals(value: T, other: T): boolean;
215
+ }
216
+
217
+ declare class BatchWriter<T> implements Writable<T> {
218
+ private readonly writer;
219
+ private readonly batcher;
220
+ constructor(writer: Writable<T>, batcher: Batcher);
221
+ write(value: T): boolean;
187
222
  }
188
- declare const ignore: Factory<Ignore>;
189
223
 
190
- interface Config {
191
- collector?: Maybe<CollectorFactory>;
192
- signal?: Maybe<SignalFactory>;
193
- computed?: Maybe<ComputedFactory>;
194
- composed?: Maybe<ComposedFactory>;
195
- effect?: Maybe<Effect>;
196
- batch?: Maybe<Batch>;
197
- ignore?: Maybe<Ignore$1>;
224
+ type internal_BasicValue<T> = BasicValue<T>;
225
+ declare const internal_BasicValue: typeof BasicValue;
226
+ type internal_BatchWriter<T> = BatchWriter<T>;
227
+ declare const internal_BatchWriter: typeof BatchWriter;
228
+ type internal_CallbackScheduler = CallbackScheduler;
229
+ declare const internal_CallbackScheduler: typeof CallbackScheduler;
230
+ type internal_CollectorBasedBatcher = CollectorBasedBatcher;
231
+ declare const internal_CollectorBasedBatcher: typeof CollectorBasedBatcher;
232
+ type internal_CollectorController<T> = CollectorController<T>;
233
+ declare const internal_CollectorController: typeof CollectorController;
234
+ type internal_Composed<T> = Composed<T>;
235
+ declare const internal_Composed: typeof Composed;
236
+ type internal_ComputedValue<T> = ComputedValue<T>;
237
+ declare const internal_ComputedValue: typeof ComputedValue;
238
+ type internal_DependencyManager = DependencyManager;
239
+ declare const internal_DependencyManager: typeof DependencyManager;
240
+ type internal_EmittingValue<T> = EmittingValue<T>;
241
+ declare const internal_EmittingValue: typeof EmittingValue;
242
+ type internal_Reactive<T> = Reactive<T>;
243
+ declare const internal_Reactive: typeof Reactive;
244
+ type internal_ScheduledEmitter = ScheduledEmitter;
245
+ declare const internal_ScheduledEmitter: typeof ScheduledEmitter;
246
+ declare const internal_Snapshot: typeof Snapshot;
247
+ declare namespace internal {
248
+ export { internal_BasicValue as BasicValue, internal_BatchWriter as BatchWriter, internal_CallbackScheduler as CallbackScheduler, internal_CollectorBasedBatcher as CollectorBasedBatcher, internal_CollectorController as CollectorController, internal_Composed as Composed, internal_ComputedValue as ComputedValue, internal_DependencyManager as DependencyManager, internal_EmittingValue as EmittingValue, internal_Reactive as Reactive, internal_ScheduledEmitter as ScheduledEmitter, internal_Snapshot as Snapshot };
198
249
  }
199
- declare function config(config?: Config): void;
200
250
 
201
- export { type Batch, type Callable, type Callback, type Collector$1 as Collector, type CollectorFactory, type Comparable, type ComposedFactory, type ComputedFactory, type Config, type Effect, type EffectCallback, type EffectCleanup, type Equals, type Factory, type Ignore, type Maybe, type Peekable, type Readable, type ReadonlySignal, type Signal$1 as Signal, type SignalFactory, type Subscribable, type Writable, batch, collector$1 as collector, composed, computed, config, effect$1 as effect, factory, ignore, index as internal, signal$1 as signal };
251
+ declare function call(callback: Callback): void;
252
+
253
+ type Factory<FactoryFunction extends Callable> = FactoryFunction & {
254
+ factory(factory: Maybe<FactoryFunction>): void;
255
+ default(factory: Maybe<FactoryFunction>): void;
256
+ configured(): boolean;
257
+ };
258
+ declare function factory<FactoryFunction extends Callable>(name: string): Factory<FactoryFunction>;
259
+
260
+ declare function singleton<T>(factory: () => T): {
261
+ (): T;
262
+ instance: T | undefined;
263
+ };
264
+
265
+ type utils_Factory<FactoryFunction extends Callable> = Factory<FactoryFunction>;
266
+ declare const utils_call: typeof call;
267
+ declare const utils_factory: typeof factory;
268
+ declare const utils_singleton: typeof singleton;
269
+ declare namespace utils {
270
+ export { type utils_Factory as Factory, utils_call as call, utils_factory as factory, utils_singleton as singleton };
271
+ }
272
+
273
+ declare function configuration(): {
274
+ signal: Factory<SignalFactory>;
275
+ computed: Factory<ComputedFactory>;
276
+ composed: Factory<ComposedFactory>;
277
+ batcher: Factory<() => Batcher>;
278
+ ignorer: Factory<() => Ignore>;
279
+ scheduler: Factory<() => Scheduler<Callback>>;
280
+ tracker: Factory<() => Tracker<ReadonlySignal<unknown>>>;
281
+ collector: Factory<() => Collector<ReadonlySignal<unknown>>>;
282
+ dependency_tracker: Factory<() => DependencyTracker>;
283
+ dependency_collector: Factory<() => CollectorController<ReadonlySignal<unknown>>>;
284
+ callback_collector: Factory<() => CollectorController<Callback>>;
285
+ };
286
+
287
+ export { type Batcher, type Callable, type Callback, type Collector, type CollectorState, type CollectorTarget, type Comparable, type Comparator, type ComposedFactory, type ComputedFactory, type DependencyObserver, type DependencyState, type DependencyTracker, type Emitter, Equals, type Ignore, internal as Internal, type Maybe, type Peekable, type Readable, type ReadonlySignal, type Scheduler, type Signal, type SignalFactory, type Subscribable, type Tracker, type Value, type Writable, type Write, batch, comparator, composed, computed, configuration, ignore, reader, signal, utils, writer };