@valentin30/signal 0.1.0 → 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.ts CHANGED
@@ -1,194 +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;
3
+ interface Batcher {
4
+ batch<Value>(callback: () => Value): Value;
5
+ batch<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
6
+ }
7
+ declare function batch<Value>(callback: () => Value): Value;
8
+ declare function batch<Value, Args extends any[]>(callback: Callable<Args, Value>, ...args: Args): Value;
4
9
 
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>;
10
+ type Write<T> = (value: T) => void | undefined | boolean;
11
+ interface Writable<T> {
12
+ write(value: T): boolean;
13
+ }
14
+ declare function writer<T>(write: Write<T>): Writable<T>;
15
+
16
+ interface Comparator<T> {
17
+ equals(value: T, other: T): boolean;
18
+ }
19
+ interface Comparable<T> extends Comparator<T> {
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;
31
+ }
32
+
33
+ interface Readable<T> {
34
+ read(): T;
35
+ }
36
+ declare function reader<T>(read: () => T): Readable<T>;
11
37
 
12
38
  type Callback = () => void;
13
39
 
14
- interface Collector<T> {
40
+ interface Subscribable {
41
+ subscribe(callback: Callback): Callback;
42
+ unsubscribe(callback: Callback): void;
43
+ }
44
+
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 {
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>;
53
+
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>;
58
+
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 {
15
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 {
92
+ }
93
+
94
+ interface Scheduler<T> {
95
+ schedule(...value: T[]): void;
96
+ }
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;
103
+ }
104
+
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>>);
16
110
  collecting(): boolean;
17
- collect(callback: Callback): Readonly<Set<T>>;
18
- ignore(callback: Callback): void;
19
- }
20
- type CollectorFactory = <T>() => Collector<T>;
21
- declare const collector: Factory<CollectorFactory>;
22
-
23
- declare function internal_batch(callback: Callback): void;
24
- declare function internal_batch(callback: Callback, collector: Collector<Callback>): void;
25
- declare function internal_batch(callback: Callback, collector?: Collector<Callback>): void;
26
- declare namespace internal_batch {
27
- const collector: Factory<collector.Factory>;
28
- namespace collector {
29
- type Factory = () => Collector<Callback>;
30
- }
31
- }
32
-
33
- declare function internal_collector<T>(): Collector<T>;
34
- declare namespace internal_collector {
35
- class Constructor<T> implements Collector<T> {
36
- #private;
37
- constructor(values: Set<T> | null);
38
- collecting(): boolean;
39
- add(value: T): void;
40
- collect(callback: Callback): Set<T>;
41
- ignore(callback: Callback): void;
42
- }
43
- }
44
-
45
- interface Comparable<T> {
46
- equals(other: T): 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;
47
117
  }
48
118
 
49
- interface Readable<T> {
119
+ declare class Composed<T> implements Signal<T> {
120
+ private readonly value;
121
+ private readonly writer;
122
+ constructor(value: ReadonlySignal<T>, writer: Writable<T>);
50
123
  read(): T;
124
+ peek(): T;
125
+ write(value: T): boolean;
126
+ equals(other: T): boolean;
127
+ equals(value: T, other: T): boolean;
128
+ subscribe(callback: Callback): Callback;
129
+ unsubscribe(callback: Callback): void;
51
130
  }
52
131
 
53
- interface Subscribable {
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[];
136
+ }
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;
54
145
  subscribe(callback: Callback): Callback;
55
146
  unsubscribe(callback: Callback): void;
147
+ private equals;
56
148
  }
57
149
 
58
- interface Writable<T> {
59
- write(value: T): void;
150
+ interface Emitter {
151
+ emit(): void;
60
152
  }
61
153
 
62
- type Equals<T> = (value: T, other: T) => boolean;
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;
161
+ }
63
162
 
64
- interface Peekable<T> {
163
+ interface Value<T> extends Readable<T>, Writable<T>, Comparable<T> {
164
+ }
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);
171
+ read(): T;
65
172
  peek(): T;
173
+ write(value: T): boolean;
174
+ equals(other: T): boolean;
175
+ equals(value: T, other: T): boolean;
176
+ subscribe(callback: Callback): Callback;
177
+ unsubscribe(callback: Callback): void;
66
178
  }
67
179
 
68
- interface Signal<T> extends Readable<T>, Writable<T>, Peekable<T>, Comparable<T>, Subscribable {
69
- }
70
- interface ReadonlySignal<T> extends Readable<T>, Peekable<T>, Comparable<T>, Subscribable {
71
- }
72
- type SignalFactory = <T>(value: T, equals?: Equals<T>) => Signal<T>;
73
- declare const signal: Factory<SignalFactory>;
74
-
75
- declare function internal_computed<T>(compute: () => T, equals?: Equals<T>): internal_computed.Constructor<T>;
76
- declare namespace internal_computed {
77
- const collector: Factory<collector.Factory>;
78
- namespace collector {
79
- type Factory = () => Collector<ReadonlySignal<unknown>>;
80
- }
81
- class Constructor<T> implements ReadonlySignal<T> {
82
- #private;
83
- constructor(empty: boolean, value: T | undefined, values: [ReadonlySignal<unknown>, unknown][], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, collector: Collector<ReadonlySignal<unknown>>, compute: () => T, equals: Maybe<Equals<T>>);
84
- read(): T;
85
- peek(): T;
86
- equals(other: T): boolean;
87
- subscribe(callback: Callback): Callback;
88
- unsubscribe(callback: Callback): void;
89
- }
90
- }
91
-
92
- declare function internal_composed<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): internal_composed.Constructor<T>;
93
- declare namespace internal_composed {
94
- const batcher: Factory<batcher.Factory>;
95
- namespace batcher {
96
- type Factory = () => Collector<Callback>;
97
- }
98
- const collector: Factory<collector.Factory>;
99
- namespace collector {
100
- type Factory = () => Collector<ReadonlySignal<unknown>>;
101
- }
102
- class Constructor<T> extends internal_computed.Constructor<T> implements Signal<T> {
103
- #private;
104
- constructor(empty: boolean, value: T | undefined, values: [ReadonlySignal<unknown>, unknown][], dependencies: Set<ReadonlySignal<unknown>>, listeners: Set<Callback>, batcher: Collector<Callback>, collector: Collector<ReadonlySignal<unknown>>, compute: () => T, write: (value: T) => void, equals: Maybe<Equals<T>>);
105
- write(value: T): void;
106
- }
107
- }
108
-
109
- type Effect = (callback: EffectCallback) => Callback;
110
- type EffectCallback = (init: boolean) => EffectCleanup | void;
111
- type EffectCleanup = (destroy: boolean) => void;
112
- declare const effect: Factory<Effect>;
113
-
114
- declare function internal_effect(cb: EffectCallback): Callback;
115
- declare namespace internal_effect {
116
- const collector: Factory<collector.Factory>;
117
- namespace collector {
118
- type Factory = () => Collector<ReadonlySignal<unknown>>;
119
- }
120
- }
121
-
122
- declare function internal_ignore<Value>(value: ReadonlySignal<Value>): Value;
123
- declare function internal_ignore<Value>(callback: () => Value): Value;
124
- declare function internal_ignore<Value, Args extends any[]>(callback: (...args: Args) => Value, ...args: Args): Value;
125
- declare namespace internal_ignore {
126
- const collector: Factory<collector.Factory>;
127
- namespace collector {
128
- type Factory = () => Collector<ReadonlySignal<unknown>>;
129
- }
130
- }
131
-
132
- declare namespace internal_shared {
133
- function batcher(): Collector<Callback>;
134
- function collector(): Collector<ReadonlySignal<unknown>>;
135
- }
136
-
137
- declare function internal_signal<T>(value: T, equals?: Equals<T>): Signal<T>;
138
- declare namespace internal_signal {
139
- const batcher: Factory<batcher.Factory>;
140
- namespace batcher {
141
- type Factory = () => Collector<Callback>;
142
- }
143
- const collector: Factory<collector.Factory>;
144
- namespace collector {
145
- type Factory = () => Collector<ReadonlySignal<unknown>>;
146
- }
147
- class Constructor<T> implements Signal<T> {
148
- #private;
149
- constructor(value: T, equals: Maybe<Equals<T>>, listeners: Set<Callback>, batcher: Collector<Callback>, collector: Collector<ReadonlySignal<unknown>>);
150
- read(): T;
151
- peek(): T;
152
- write(value: T): void;
153
- equals(other: T): boolean;
154
- subscribe(callback: Callback): Callback;
155
- unsubscribe(callback: Callback): void;
156
- }
157
- }
158
-
159
- declare namespace index {
160
- export { internal_batch as batch, internal_collector as collector, internal_composed as composed, internal_computed as computed, internal_effect as effect, internal_ignore as ignore, internal_shared as shared, internal_signal as signal };
161
- }
162
-
163
- interface Batch {
164
- (callback: Callback): void;
165
- (callback: Callback, collector: Collector<Callback>): void;
166
- (callback: Callback, collector?: Collector<Callback>): void;
167
- }
168
- declare const batch: Factory<Batch>;
169
-
170
- type ComposedFactory = <T>(read: () => T, write: (value: T) => void, equals?: Equals<T>) => Signal<T>;
171
- declare const composed: Factory<ComposedFactory>;
172
-
173
- type ComputedFactory = <T>(read: () => T, equals?: Equals<T>) => ReadonlySignal<T>;
174
- 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
+ }
175
186
 
176
- interface Ignore {
177
- <Value>(value: ReadonlySignal<Value>): Value;
178
- <Value>(callback: () => Value): Value;
179
- <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;
180
215
  }
181
- declare const ignore: Factory<Ignore>;
182
216
 
183
- interface Config {
184
- collector?: Maybe<CollectorFactory>;
185
- signal?: Maybe<SignalFactory>;
186
- computed?: Maybe<ComputedFactory>;
187
- composed?: Maybe<ComposedFactory>;
188
- effect?: Maybe<Effect>;
189
- batch?: Maybe<Batch>;
190
- ignore?: Maybe<Ignore>;
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;
191
222
  }
192
- declare function config(config?: Config): void;
193
223
 
194
- export { type Batch, type Callable, type Callback, type 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, type SignalFactory, type Subscribable, type Writable, batch, collector, composed, computed, config, effect, factory, ignore, index as internal, signal };
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 };
249
+ }
250
+
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 };