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