@@ -19,16 +19,6 @@ function _getCurrentObserver(): VoidFunction | undefined {
1919 return context [ context . length - 1 ] ;
2020}
2121
22- const UNSET = Symbol ( "UNSET" ) ;
23- const COMPUTING = Symbol ( "COMPUTING" ) ;
24- const ERRORED = Symbol ( "ERRORED" ) ;
25- const READY = Symbol ( "READY" ) ;
26-
27- interface EffectNode {
28- error : unknown ;
29- state : symbol ;
30- }
31-
3222/**
3323 * Creates a new effect that will be executed immediately and whenever
3424 * any of the signals it reads from change.
@@ -49,22 +39,10 @@ interface EffectNode {
4939 * @param fn The function to execute
5040 */
5141function $effect ( fn : VoidFunction ) : void {
52- const effectNode : EffectNode = {
53- error : null ,
54- state : UNSET
55- }
56-
5742 const execute = ( ) => {
58- if ( effectNode . state === COMPUTING ) {
59- throw new Error ( "Circular dependency detected" ) ;
60- }
61-
6243 context . push ( execute ) ;
6344 try {
64- effectNode . state = COMPUTING ;
6545 fn ( ) ;
66- effectNode . error = null ;
67- effectNode . state = READY ;
6846 } finally {
6947 context . pop ( ) ;
7048 }
@@ -73,22 +51,8 @@ function $effect(fn: VoidFunction): void {
7351 execute ( ) ;
7452}
7553
76- interface ComputedNode < T > {
77- signal : Signal < T | undefined > ;
78- error : unknown ;
79- state : symbol ;
80- }
81-
8254type ComputedFunction < T > = ( ) => T ;
8355
84- function computedGetter < T > ( node : ComputedNode < T > ) {
85- if ( node . state === ERRORED ) {
86- throw node . error ;
87- }
88-
89- return node . signal . readOnly as ReadOnlySignal < T > ;
90- }
91-
9256/**
9357 * Creates a new computed value that will be updated whenever the signals
9458 * it reads from change. Returns a read-only signal that contains the
@@ -105,29 +69,15 @@ function computedGetter<T>(node: ComputedNode<T>) {
10569 * @param fn The function that returns the computed value.
10670 */
10771function $computed < T > ( fn : ComputedFunction < T > ) : ReadOnlySignal < T > {
108- const computedNode : ComputedNode < T > = {
109- signal : $signal < T | undefined > ( undefined ) ,
110- error : null ,
111- state : UNSET
112- } ;
72+ // The initial value is undefined, as it will be computed
73+ // when the effect runs for the first time
74+ const computedSignal : Signal < T | undefined > = $signal ( undefined ) ;
11375
11476 $effect ( ( ) => {
115- if ( computedNode . state === COMPUTING ) {
116- throw new Error ( "Circular dependency detected" ) ;
117- }
118-
119- try {
120- computedNode . state = COMPUTING ;
121- computedNode . signal . value = fn ( ) ;
122- computedNode . error = null ;
123- computedNode . state = READY ;
124- } catch ( error ) {
125- computedNode . state = ERRORED ;
126- computedNode . error = error ;
127- }
77+ computedSignal . value = fn ( ) ;
12878 } ) ;
12979
130- return computedGetter ( computedNode ) ;
80+ return computedSignal . readOnly as ReadOnlySignal < T > ;
13181}
13282
13383type StorageFn < T > = ( value : T ) => State < T > & { [ key : string ] : unknown } ;
0 commit comments