@valentin30/signal 0.0.1 → 0.0.2
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 +202 -2
- package/dist/index.d.ts +152 -2
- package/dist/index.js +241 -2
- package/dist/index.mjs +240 -2
- package/package.json +3 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,3 +1,203 @@
|
|
|
1
|
-
|
|
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
|
|
9
|
+
|
|
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>
|
|
16
|
+
}
|
|
17
|
+
type collector_type = typeof collector$1
|
|
18
|
+
interface collector$1 extends collector_type {}
|
|
19
|
+
declare const collector$1: Factory<CollectorFactoryFunction>
|
|
20
|
+
|
|
21
|
+
type Equals<T> = (value: T, other: T) => boolean
|
|
22
|
+
interface Comparable<T> {
|
|
23
|
+
equals(other: T): boolean
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface Reader<T> {
|
|
27
|
+
read(): T
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type Callback = () => void
|
|
31
|
+
|
|
32
|
+
interface Subscription {
|
|
33
|
+
subscribe(callback: Callback): Callback
|
|
34
|
+
unsubscribe(callback: Callback): void
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface Writer<T> {
|
|
38
|
+
write(value: T): void
|
|
39
|
+
}
|
|
40
|
+
|
|
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>
|
|
45
|
+
}
|
|
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>
|
|
50
|
+
}
|
|
51
|
+
declare const composed$1: Factory<ComposedFactoryFunction>
|
|
52
|
+
|
|
53
|
+
interface ComputedFactoryFunction {
|
|
54
|
+
<T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>
|
|
55
|
+
}
|
|
56
|
+
declare const computed$1: Factory<ComputedFactoryFunction>
|
|
57
|
+
|
|
58
|
+
declare function collector<T>(): Collector$1<T>
|
|
59
|
+
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>
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
declare function computed<T>(compute: () => T, equals?: Equals<T>): Computed<T>
|
|
67
|
+
declare namespace computed {
|
|
68
|
+
var collector: Factory<ComputedCollectorFactoryFunction>
|
|
69
|
+
}
|
|
70
|
+
interface ComputedCollectorFactoryFunction {
|
|
71
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>
|
|
72
|
+
}
|
|
73
|
+
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>
|
|
100
|
+
declare namespace composed {
|
|
101
|
+
var collector: Factory<ComposedCollectorFactoryFunction>
|
|
102
|
+
}
|
|
103
|
+
interface ComposedCollectorFactoryFunction {
|
|
104
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>
|
|
105
|
+
}
|
|
106
|
+
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>
|
|
125
|
+
}
|
|
126
|
+
interface SignalCollectorFactoryFunction {
|
|
127
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>
|
|
128
|
+
}
|
|
129
|
+
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
|
|
157
|
+
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
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
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,
|
|
203
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,153 @@
|
|
|
1
|
-
|
|
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;
|
|
9
|
+
|
|
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>;
|
|
16
|
+
}
|
|
17
|
+
type collector_type = typeof collector$1;
|
|
18
|
+
interface collector$1 extends collector_type {
|
|
19
|
+
}
|
|
20
|
+
declare const collector$1: Factory<CollectorFactoryFunction>;
|
|
21
|
+
|
|
22
|
+
type Equals<T> = (value: T, other: T) => boolean;
|
|
23
|
+
interface Comparable<T> {
|
|
24
|
+
equals(other: T): boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Reader<T> {
|
|
28
|
+
read(): T;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Callback = () => void;
|
|
32
|
+
|
|
33
|
+
interface Subscription {
|
|
34
|
+
subscribe(callback: Callback): Callback;
|
|
35
|
+
unsubscribe(callback: Callback): void;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface Writer<T> {
|
|
39
|
+
write(value: T): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface Signal$1<T> extends Reader<T>, Writer<T>, Comparable<T>, Subscription {
|
|
43
|
+
}
|
|
44
|
+
interface ReadonlySignal<T> extends Reader<T>, Comparable<T>, Subscription {
|
|
45
|
+
}
|
|
46
|
+
interface SignalFactoryFunction {
|
|
47
|
+
<T>(value: T, equals?: Equals<T>): Signal$1<T>;
|
|
48
|
+
}
|
|
49
|
+
declare const signal$1: Factory<SignalFactoryFunction>;
|
|
50
|
+
|
|
51
|
+
interface ComposedFactoryFunction {
|
|
52
|
+
<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Signal$1<T>;
|
|
53
|
+
}
|
|
54
|
+
declare const composed$1: Factory<ComposedFactoryFunction>;
|
|
55
|
+
|
|
56
|
+
interface ComputedFactoryFunction {
|
|
57
|
+
<T>(compute: () => T, equals?: Equals<T>): ReadonlySignal<T>;
|
|
58
|
+
}
|
|
59
|
+
declare const computed$1: Factory<ComputedFactoryFunction>;
|
|
60
|
+
|
|
61
|
+
declare function collector<T>(): Collector$1<T>;
|
|
62
|
+
declare class Collector<T> implements Collector$1<T> {
|
|
63
|
+
private values;
|
|
64
|
+
constructor(values: Set<T> | null);
|
|
65
|
+
add(value: T): void;
|
|
66
|
+
collect(callback: () => void): Set<T>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
declare function computed<T>(compute: () => T, equals?: Equals<T>): Computed<T>;
|
|
70
|
+
declare namespace computed {
|
|
71
|
+
var collector: Factory<ComputedCollectorFactoryFunction>;
|
|
72
|
+
}
|
|
73
|
+
interface ComputedCollectorFactoryFunction {
|
|
74
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>;
|
|
75
|
+
}
|
|
76
|
+
declare class Computed<T> implements ReadonlySignal<T> {
|
|
77
|
+
private empty;
|
|
78
|
+
private value;
|
|
79
|
+
private values;
|
|
80
|
+
private dependencies;
|
|
81
|
+
private readonly compute;
|
|
82
|
+
private readonly equalsFn;
|
|
83
|
+
private readonly listeners;
|
|
84
|
+
private readonly collector;
|
|
85
|
+
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>>);
|
|
86
|
+
private dirty;
|
|
87
|
+
read(): T;
|
|
88
|
+
equals(other: T): boolean;
|
|
89
|
+
subscribe(callback: Callback): Callback;
|
|
90
|
+
unsubscribe(callback: Callback): void;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
declare function composed<T>(compute: () => T, write: (value: T) => void, equals?: Equals<T>): Composed<T>;
|
|
94
|
+
declare namespace composed {
|
|
95
|
+
var collector: Factory<ComposedCollectorFactoryFunction>;
|
|
96
|
+
}
|
|
97
|
+
interface ComposedCollectorFactoryFunction {
|
|
98
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>;
|
|
99
|
+
}
|
|
100
|
+
declare class Composed<T> extends Computed<T> implements Signal$1<T> {
|
|
101
|
+
private readonly writeFn;
|
|
102
|
+
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
|
+
write(value: T): void;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
declare function signal<T>(value: T, equals?: Equals<T>): Signal$1<T>;
|
|
107
|
+
declare namespace signal {
|
|
108
|
+
var collector: Factory<SignalCollectorFactoryFunction>;
|
|
109
|
+
}
|
|
110
|
+
interface SignalCollectorFactoryFunction {
|
|
111
|
+
(): Maybe<Collector$1<ReadonlySignal<unknown>>>;
|
|
112
|
+
}
|
|
113
|
+
declare class Signal<T> implements Signal$1<T> {
|
|
114
|
+
private value;
|
|
115
|
+
private equalsFn;
|
|
116
|
+
private listeners;
|
|
117
|
+
private collector;
|
|
118
|
+
constructor(value: T, equals: Maybe<Equals<T>>, listeners: Set<Callback>, collector: Maybe<Collector$1<ReadonlySignal<unknown>>>);
|
|
119
|
+
read(): T;
|
|
120
|
+
write(value: T): void;
|
|
121
|
+
equals(other: T): boolean;
|
|
122
|
+
subscribe(callback: Callback): Callback;
|
|
123
|
+
unsubscribe(callback: Callback): void;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
type index_Collector<T> = Collector<T>;
|
|
127
|
+
declare const index_Collector: typeof Collector;
|
|
128
|
+
type index_Composed<T> = Composed<T>;
|
|
129
|
+
declare const index_Composed: typeof Composed;
|
|
130
|
+
type index_ComposedCollectorFactoryFunction = ComposedCollectorFactoryFunction;
|
|
131
|
+
type index_Computed<T> = Computed<T>;
|
|
132
|
+
declare const index_Computed: typeof Computed;
|
|
133
|
+
type index_ComputedCollectorFactoryFunction = ComputedCollectorFactoryFunction;
|
|
134
|
+
type index_Signal<T> = Signal<T>;
|
|
135
|
+
declare const index_Signal: typeof Signal;
|
|
136
|
+
type index_SignalCollectorFactoryFunction = SignalCollectorFactoryFunction;
|
|
137
|
+
declare const index_collector: typeof collector;
|
|
138
|
+
declare const index_composed: typeof composed;
|
|
139
|
+
declare const index_computed: typeof computed;
|
|
140
|
+
declare const index_signal: typeof signal;
|
|
141
|
+
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 };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
interface Config {
|
|
146
|
+
collector?: Maybe<CollectorFactoryFunction>;
|
|
147
|
+
signal?: Maybe<SignalFactoryFunction>;
|
|
148
|
+
computed?: Maybe<ComputedFactoryFunction>;
|
|
149
|
+
composed?: Maybe<ComposedFactoryFunction>;
|
|
150
|
+
}
|
|
151
|
+
declare function config(config?: Config): void;
|
|
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 };
|
package/dist/index.js
CHANGED
|
@@ -20,13 +20,252 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
collector: () => collector,
|
|
24
|
+
composed: () => composed,
|
|
25
|
+
computed: () => computed,
|
|
26
|
+
config: () => config,
|
|
27
|
+
internal: () => internal_exports,
|
|
23
28
|
signal: () => signal
|
|
24
29
|
});
|
|
25
30
|
module.exports = __toCommonJS(index_exports);
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
|
|
32
|
+
// src/core/factory.ts
|
|
33
|
+
function factory(name) {
|
|
34
|
+
let __default__ = null;
|
|
35
|
+
let __factory__ = null;
|
|
36
|
+
function object(...args) {
|
|
37
|
+
if (__factory__) return __factory__(...args);
|
|
38
|
+
if (__default__) return __default__(...args);
|
|
39
|
+
throw new Error(`${name}.factory() not configured!`);
|
|
40
|
+
}
|
|
41
|
+
object.default = (factory2) => {
|
|
42
|
+
__default__ = factory2;
|
|
43
|
+
};
|
|
44
|
+
object.factory = (factory2) => {
|
|
45
|
+
__factory__ = factory2;
|
|
46
|
+
};
|
|
47
|
+
object.configured = () => __default__ !== null || __factory__ !== null;
|
|
48
|
+
return object;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// src/core/collector.ts
|
|
52
|
+
var collector = factory("collector");
|
|
53
|
+
|
|
54
|
+
// src/core/composed.ts
|
|
55
|
+
var composed = factory("composed");
|
|
56
|
+
|
|
57
|
+
// src/core/computed.ts
|
|
58
|
+
var computed = factory("computed");
|
|
59
|
+
|
|
60
|
+
// src/core/signal.ts
|
|
61
|
+
var signal = factory("signal");
|
|
62
|
+
|
|
63
|
+
// src/internal/index.ts
|
|
64
|
+
var internal_exports = {};
|
|
65
|
+
__export(internal_exports, {
|
|
66
|
+
Collector: () => Collector,
|
|
67
|
+
Composed: () => Composed,
|
|
68
|
+
Computed: () => Computed,
|
|
69
|
+
Signal: () => Signal,
|
|
70
|
+
collector: () => collector2,
|
|
71
|
+
composed: () => composed2,
|
|
72
|
+
computed: () => computed2,
|
|
73
|
+
signal: () => signal2
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// src/internal/collector.ts
|
|
77
|
+
function collector2() {
|
|
78
|
+
return new Collector(null);
|
|
79
|
+
}
|
|
80
|
+
var Collector = class {
|
|
81
|
+
values;
|
|
82
|
+
constructor(values) {
|
|
83
|
+
this.values = values;
|
|
84
|
+
}
|
|
85
|
+
add(value) {
|
|
86
|
+
if (!this.values) return;
|
|
87
|
+
this.values.add(value);
|
|
88
|
+
}
|
|
89
|
+
collect(callback) {
|
|
90
|
+
const current = this.values;
|
|
91
|
+
this.values = /* @__PURE__ */ new Set();
|
|
92
|
+
callback();
|
|
93
|
+
const collected = this.values;
|
|
94
|
+
this.values = current;
|
|
95
|
+
return collected;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/internal/computed.ts
|
|
100
|
+
function computed2(compute, equals) {
|
|
101
|
+
if (!computed2.collector()) {
|
|
102
|
+
throw new Error("computed: collector is not configured.");
|
|
103
|
+
}
|
|
104
|
+
return new Computed(
|
|
105
|
+
true,
|
|
106
|
+
void 0,
|
|
107
|
+
[],
|
|
108
|
+
/* @__PURE__ */ new Set(),
|
|
109
|
+
/* @__PURE__ */ new Set(),
|
|
110
|
+
computed2.collector(),
|
|
111
|
+
compute,
|
|
112
|
+
equals
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
computed2.collector = factory("computed.collector");
|
|
116
|
+
var Computed = class {
|
|
117
|
+
empty;
|
|
118
|
+
value;
|
|
119
|
+
values;
|
|
120
|
+
dependencies;
|
|
121
|
+
compute;
|
|
122
|
+
equalsFn;
|
|
123
|
+
listeners;
|
|
124
|
+
collector;
|
|
125
|
+
constructor(empty, value, values, dependencies, listeners, collector3, compute, equals) {
|
|
126
|
+
this.empty = empty;
|
|
127
|
+
this.value = value;
|
|
128
|
+
this.values = values;
|
|
129
|
+
this.dependencies = dependencies;
|
|
130
|
+
this.listeners = listeners;
|
|
131
|
+
this.collector = collector3;
|
|
132
|
+
this.compute = compute;
|
|
133
|
+
this.equalsFn = equals;
|
|
134
|
+
}
|
|
135
|
+
dirty() {
|
|
136
|
+
if (this.empty) return true;
|
|
137
|
+
return Array.from(this.dependencies).some((dependency, index) => !dependency.equals(this.values[index]));
|
|
138
|
+
}
|
|
139
|
+
read() {
|
|
140
|
+
this.collector.add(this);
|
|
141
|
+
if (!this.dirty()) return this.value;
|
|
142
|
+
const current = this.dependencies;
|
|
143
|
+
const next = this.collector.collect(() => {
|
|
144
|
+
this.value = this.compute();
|
|
145
|
+
});
|
|
146
|
+
this.dependencies = next;
|
|
147
|
+
this.values = Array.from(this.dependencies).map((dependency) => dependency.read());
|
|
148
|
+
this.empty = false;
|
|
149
|
+
if (!current.size && !next.size) return this.value;
|
|
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
|
+
});
|
|
159
|
+
return this.value;
|
|
160
|
+
}
|
|
161
|
+
equals(other) {
|
|
162
|
+
if (this.equalsFn) return this.equalsFn(this.read(), other);
|
|
163
|
+
return this.read() === other;
|
|
164
|
+
}
|
|
165
|
+
subscribe(callback) {
|
|
166
|
+
this.listeners.add(callback);
|
|
167
|
+
this.dependencies.forEach((dependency) => dependency.subscribe(callback));
|
|
168
|
+
return () => this.unsubscribe(callback);
|
|
169
|
+
}
|
|
170
|
+
unsubscribe(callback) {
|
|
171
|
+
this.listeners.delete(callback);
|
|
172
|
+
this.dependencies.forEach((dependency) => dependency.unsubscribe(callback));
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// src/internal/composed.ts
|
|
177
|
+
function composed2(compute, write, equals) {
|
|
178
|
+
if (!composed2.collector()) {
|
|
179
|
+
throw new Error("composed: collector is not configured.");
|
|
180
|
+
}
|
|
181
|
+
return new Composed(
|
|
182
|
+
true,
|
|
183
|
+
void 0,
|
|
184
|
+
[],
|
|
185
|
+
/* @__PURE__ */ new Set(),
|
|
186
|
+
/* @__PURE__ */ new Set(),
|
|
187
|
+
composed2.collector(),
|
|
188
|
+
compute,
|
|
189
|
+
write,
|
|
190
|
+
equals
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
composed2.collector = factory("composed.collector");
|
|
194
|
+
var Composed = class extends Computed {
|
|
195
|
+
writeFn;
|
|
196
|
+
constructor(empty, value, values, dependencies, listeners, collector3, compute, write, equals) {
|
|
197
|
+
super(empty, value, values, dependencies, listeners, collector3, compute, equals);
|
|
198
|
+
this.writeFn = write;
|
|
199
|
+
}
|
|
200
|
+
write(value) {
|
|
201
|
+
if (this.equals(value)) return;
|
|
202
|
+
this.writeFn(value);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// src/internal/signal.ts
|
|
207
|
+
function signal2(value, equals) {
|
|
208
|
+
return new Signal(value, equals, /* @__PURE__ */ new Set(), signal2.collector());
|
|
209
|
+
}
|
|
210
|
+
signal2.collector = factory("signal.collector");
|
|
211
|
+
var Signal = class {
|
|
212
|
+
value;
|
|
213
|
+
equalsFn;
|
|
214
|
+
listeners;
|
|
215
|
+
collector;
|
|
216
|
+
constructor(value, equals, listeners, collector3) {
|
|
217
|
+
this.value = value;
|
|
218
|
+
this.equalsFn = equals;
|
|
219
|
+
this.listeners = listeners;
|
|
220
|
+
this.collector = collector3;
|
|
221
|
+
}
|
|
222
|
+
read() {
|
|
223
|
+
if (this.collector) this.collector.add(this);
|
|
224
|
+
return this.value;
|
|
225
|
+
}
|
|
226
|
+
write(value) {
|
|
227
|
+
if (this.equals(value)) return;
|
|
228
|
+
this.value = value;
|
|
229
|
+
this.listeners.forEach((listener) => listener());
|
|
230
|
+
}
|
|
231
|
+
equals(other) {
|
|
232
|
+
if (this.equalsFn) return this.equalsFn(this.value, other);
|
|
233
|
+
return this.value === other;
|
|
234
|
+
}
|
|
235
|
+
subscribe(callback) {
|
|
236
|
+
this.listeners.add(callback);
|
|
237
|
+
return () => this.unsubscribe(callback);
|
|
238
|
+
}
|
|
239
|
+
unsubscribe(callback) {
|
|
240
|
+
this.listeners.delete(callback);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/index.ts
|
|
245
|
+
function config(config2 = {}) {
|
|
246
|
+
signal.factory(config2.signal);
|
|
247
|
+
collector.factory(config2.collector);
|
|
248
|
+
computed.factory(config2.computed);
|
|
249
|
+
composed.factory(config2.composed);
|
|
250
|
+
}
|
|
251
|
+
var __shared__ = null;
|
|
252
|
+
function shared() {
|
|
253
|
+
if (!__shared__) __shared__ = collector();
|
|
254
|
+
return __shared__;
|
|
28
255
|
}
|
|
256
|
+
signal2.collector.default(shared);
|
|
257
|
+
computed2.collector.default(shared);
|
|
258
|
+
composed2.collector.default(shared);
|
|
259
|
+
signal.default(signal2);
|
|
260
|
+
collector.default(collector2);
|
|
261
|
+
computed.default(computed2);
|
|
262
|
+
composed.default(composed2);
|
|
29
263
|
// Annotate the CommonJS export names for ESM import in node:
|
|
30
264
|
0 && (module.exports = {
|
|
265
|
+
collector,
|
|
266
|
+
composed,
|
|
267
|
+
computed,
|
|
268
|
+
config,
|
|
269
|
+
internal,
|
|
31
270
|
signal
|
|
32
271
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,245 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/core/factory.ts
|
|
8
|
+
function factory(name) {
|
|
9
|
+
let __default__ = null;
|
|
10
|
+
let __factory__ = null;
|
|
11
|
+
function object(...args) {
|
|
12
|
+
if (__factory__) return __factory__(...args);
|
|
13
|
+
if (__default__) return __default__(...args);
|
|
14
|
+
throw new Error(`${name}.factory() not configured!`);
|
|
15
|
+
}
|
|
16
|
+
object.default = (factory2) => {
|
|
17
|
+
__default__ = factory2;
|
|
18
|
+
};
|
|
19
|
+
object.factory = (factory2) => {
|
|
20
|
+
__factory__ = factory2;
|
|
21
|
+
};
|
|
22
|
+
object.configured = () => __default__ !== null || __factory__ !== null;
|
|
23
|
+
return object;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/core/collector.ts
|
|
27
|
+
var collector = factory("collector");
|
|
28
|
+
|
|
29
|
+
// src/core/composed.ts
|
|
30
|
+
var composed = factory("composed");
|
|
31
|
+
|
|
32
|
+
// src/core/computed.ts
|
|
33
|
+
var computed = factory("computed");
|
|
34
|
+
|
|
35
|
+
// src/core/signal.ts
|
|
36
|
+
var signal = factory("signal");
|
|
37
|
+
|
|
38
|
+
// src/internal/index.ts
|
|
39
|
+
var internal_exports = {};
|
|
40
|
+
__export(internal_exports, {
|
|
41
|
+
Collector: () => Collector,
|
|
42
|
+
Composed: () => Composed,
|
|
43
|
+
Computed: () => Computed,
|
|
44
|
+
Signal: () => Signal,
|
|
45
|
+
collector: () => collector2,
|
|
46
|
+
composed: () => composed2,
|
|
47
|
+
computed: () => computed2,
|
|
48
|
+
signal: () => signal2
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// src/internal/collector.ts
|
|
52
|
+
function collector2() {
|
|
53
|
+
return new Collector(null);
|
|
54
|
+
}
|
|
55
|
+
var Collector = class {
|
|
56
|
+
values;
|
|
57
|
+
constructor(values) {
|
|
58
|
+
this.values = values;
|
|
59
|
+
}
|
|
60
|
+
add(value) {
|
|
61
|
+
if (!this.values) return;
|
|
62
|
+
this.values.add(value);
|
|
63
|
+
}
|
|
64
|
+
collect(callback) {
|
|
65
|
+
const current = this.values;
|
|
66
|
+
this.values = /* @__PURE__ */ new Set();
|
|
67
|
+
callback();
|
|
68
|
+
const collected = this.values;
|
|
69
|
+
this.values = current;
|
|
70
|
+
return collected;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// src/internal/computed.ts
|
|
75
|
+
function computed2(compute, equals) {
|
|
76
|
+
if (!computed2.collector()) {
|
|
77
|
+
throw new Error("computed: collector is not configured.");
|
|
78
|
+
}
|
|
79
|
+
return new Computed(
|
|
80
|
+
true,
|
|
81
|
+
void 0,
|
|
82
|
+
[],
|
|
83
|
+
/* @__PURE__ */ new Set(),
|
|
84
|
+
/* @__PURE__ */ new Set(),
|
|
85
|
+
computed2.collector(),
|
|
86
|
+
compute,
|
|
87
|
+
equals
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
computed2.collector = factory("computed.collector");
|
|
91
|
+
var Computed = class {
|
|
92
|
+
empty;
|
|
93
|
+
value;
|
|
94
|
+
values;
|
|
95
|
+
dependencies;
|
|
96
|
+
compute;
|
|
97
|
+
equalsFn;
|
|
98
|
+
listeners;
|
|
99
|
+
collector;
|
|
100
|
+
constructor(empty, value, values, dependencies, listeners, collector3, compute, equals) {
|
|
101
|
+
this.empty = empty;
|
|
102
|
+
this.value = value;
|
|
103
|
+
this.values = values;
|
|
104
|
+
this.dependencies = dependencies;
|
|
105
|
+
this.listeners = listeners;
|
|
106
|
+
this.collector = collector3;
|
|
107
|
+
this.compute = compute;
|
|
108
|
+
this.equalsFn = equals;
|
|
109
|
+
}
|
|
110
|
+
dirty() {
|
|
111
|
+
if (this.empty) return true;
|
|
112
|
+
return Array.from(this.dependencies).some((dependency, index) => !dependency.equals(this.values[index]));
|
|
113
|
+
}
|
|
114
|
+
read() {
|
|
115
|
+
this.collector.add(this);
|
|
116
|
+
if (!this.dirty()) return this.value;
|
|
117
|
+
const current = this.dependencies;
|
|
118
|
+
const next = this.collector.collect(() => {
|
|
119
|
+
this.value = this.compute();
|
|
120
|
+
});
|
|
121
|
+
this.dependencies = next;
|
|
122
|
+
this.values = Array.from(this.dependencies).map((dependency) => dependency.read());
|
|
123
|
+
this.empty = false;
|
|
124
|
+
if (!current.size && !next.size) return this.value;
|
|
125
|
+
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
|
+
});
|
|
134
|
+
return this.value;
|
|
135
|
+
}
|
|
136
|
+
equals(other) {
|
|
137
|
+
if (this.equalsFn) return this.equalsFn(this.read(), other);
|
|
138
|
+
return this.read() === other;
|
|
139
|
+
}
|
|
140
|
+
subscribe(callback) {
|
|
141
|
+
this.listeners.add(callback);
|
|
142
|
+
this.dependencies.forEach((dependency) => dependency.subscribe(callback));
|
|
143
|
+
return () => this.unsubscribe(callback);
|
|
144
|
+
}
|
|
145
|
+
unsubscribe(callback) {
|
|
146
|
+
this.listeners.delete(callback);
|
|
147
|
+
this.dependencies.forEach((dependency) => dependency.unsubscribe(callback));
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// src/internal/composed.ts
|
|
152
|
+
function composed2(compute, write, equals) {
|
|
153
|
+
if (!composed2.collector()) {
|
|
154
|
+
throw new Error("composed: collector is not configured.");
|
|
155
|
+
}
|
|
156
|
+
return new Composed(
|
|
157
|
+
true,
|
|
158
|
+
void 0,
|
|
159
|
+
[],
|
|
160
|
+
/* @__PURE__ */ new Set(),
|
|
161
|
+
/* @__PURE__ */ new Set(),
|
|
162
|
+
composed2.collector(),
|
|
163
|
+
compute,
|
|
164
|
+
write,
|
|
165
|
+
equals
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
composed2.collector = factory("composed.collector");
|
|
169
|
+
var Composed = class extends Computed {
|
|
170
|
+
writeFn;
|
|
171
|
+
constructor(empty, value, values, dependencies, listeners, collector3, compute, write, equals) {
|
|
172
|
+
super(empty, value, values, dependencies, listeners, collector3, compute, equals);
|
|
173
|
+
this.writeFn = write;
|
|
174
|
+
}
|
|
175
|
+
write(value) {
|
|
176
|
+
if (this.equals(value)) return;
|
|
177
|
+
this.writeFn(value);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// src/internal/signal.ts
|
|
182
|
+
function signal2(value, equals) {
|
|
183
|
+
return new Signal(value, equals, /* @__PURE__ */ new Set(), signal2.collector());
|
|
184
|
+
}
|
|
185
|
+
signal2.collector = factory("signal.collector");
|
|
186
|
+
var Signal = class {
|
|
187
|
+
value;
|
|
188
|
+
equalsFn;
|
|
189
|
+
listeners;
|
|
190
|
+
collector;
|
|
191
|
+
constructor(value, equals, listeners, collector3) {
|
|
192
|
+
this.value = value;
|
|
193
|
+
this.equalsFn = equals;
|
|
194
|
+
this.listeners = listeners;
|
|
195
|
+
this.collector = collector3;
|
|
196
|
+
}
|
|
197
|
+
read() {
|
|
198
|
+
if (this.collector) this.collector.add(this);
|
|
199
|
+
return this.value;
|
|
200
|
+
}
|
|
201
|
+
write(value) {
|
|
202
|
+
if (this.equals(value)) return;
|
|
203
|
+
this.value = value;
|
|
204
|
+
this.listeners.forEach((listener) => listener());
|
|
205
|
+
}
|
|
206
|
+
equals(other) {
|
|
207
|
+
if (this.equalsFn) return this.equalsFn(this.value, other);
|
|
208
|
+
return this.value === other;
|
|
209
|
+
}
|
|
210
|
+
subscribe(callback) {
|
|
211
|
+
this.listeners.add(callback);
|
|
212
|
+
return () => this.unsubscribe(callback);
|
|
213
|
+
}
|
|
214
|
+
unsubscribe(callback) {
|
|
215
|
+
this.listeners.delete(callback);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
1
219
|
// src/index.ts
|
|
2
|
-
function
|
|
3
|
-
|
|
220
|
+
function config(config2 = {}) {
|
|
221
|
+
signal.factory(config2.signal);
|
|
222
|
+
collector.factory(config2.collector);
|
|
223
|
+
computed.factory(config2.computed);
|
|
224
|
+
composed.factory(config2.composed);
|
|
225
|
+
}
|
|
226
|
+
var __shared__ = null;
|
|
227
|
+
function shared() {
|
|
228
|
+
if (!__shared__) __shared__ = collector();
|
|
229
|
+
return __shared__;
|
|
4
230
|
}
|
|
231
|
+
signal2.collector.default(shared);
|
|
232
|
+
computed2.collector.default(shared);
|
|
233
|
+
composed2.collector.default(shared);
|
|
234
|
+
signal.default(signal2);
|
|
235
|
+
collector.default(collector2);
|
|
236
|
+
computed.default(computed2);
|
|
237
|
+
composed.default(composed2);
|
|
5
238
|
export {
|
|
239
|
+
collector,
|
|
240
|
+
composed,
|
|
241
|
+
computed,
|
|
242
|
+
config,
|
|
243
|
+
internal_exports as internal,
|
|
6
244
|
signal
|
|
7
245
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@valentin30/signal",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -19,13 +19,14 @@
|
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "git+https://github.com/valentin30/signal.git"
|
|
21
21
|
},
|
|
22
|
-
"author": "Valentin
|
|
22
|
+
"author": "Valentin",
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"bugs": {
|
|
25
25
|
"url": "https://github.com/valentin30/signal/issues"
|
|
26
26
|
},
|
|
27
27
|
"homepage": "https://github.com/valentin30/signal#readme",
|
|
28
28
|
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.15.29",
|
|
29
30
|
"rimraf": "^6.0.1",
|
|
30
31
|
"tsup": "^8.5.0",
|
|
31
32
|
"typescript": "^5.8.3",
|