@@ -19,16 +19,6 @@ function _getCurrentObserver(): VoidFunction | undefined {
19
19
return context [ context . length - 1 ] ;
20
20
}
21
21
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
-
32
22
/**
33
23
* Creates a new effect that will be executed immediately and whenever
34
24
* any of the signals it reads from change.
@@ -49,22 +39,10 @@ interface EffectNode {
49
39
* @param fn The function to execute
50
40
*/
51
41
function $effect ( fn : VoidFunction ) : void {
52
- const effectNode : EffectNode = {
53
- error : null ,
54
- state : UNSET
55
- }
56
-
57
42
const execute = ( ) => {
58
- if ( effectNode . state === COMPUTING ) {
59
- throw new Error ( "Circular dependency detected" ) ;
60
- }
61
-
62
43
context . push ( execute ) ;
63
44
try {
64
- effectNode . state = COMPUTING ;
65
45
fn ( ) ;
66
- effectNode . error = null ;
67
- effectNode . state = READY ;
68
46
} finally {
69
47
context . pop ( ) ;
70
48
}
@@ -73,22 +51,8 @@ function $effect(fn: VoidFunction): void {
73
51
execute ( ) ;
74
52
}
75
53
76
- interface ComputedNode < T > {
77
- signal : Signal < T | undefined > ;
78
- error : unknown ;
79
- state : symbol ;
80
- }
81
-
82
54
type ComputedFunction < T > = ( ) => T ;
83
55
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
-
92
56
/**
93
57
* Creates a new computed value that will be updated whenever the signals
94
58
* it reads from change. Returns a read-only signal that contains the
@@ -105,29 +69,15 @@ function computedGetter<T>(node: ComputedNode<T>) {
105
69
* @param fn The function that returns the computed value.
106
70
*/
107
71
function $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 ) ;
113
75
114
76
$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 ( ) ;
128
78
} ) ;
129
79
130
- return computedGetter ( computedNode ) ;
80
+ return computedSignal . readOnly as ReadOnlySignal < T > ;
131
81
}
132
82
133
83
type StorageFn < T > = ( value : T ) => State < T > & { [ key : string ] : unknown } ;
0 commit comments