@@ -56,4 +56,50 @@ describe('liveness', () => {
56
56
expect ( watchedSpy ) . toBeCalledTimes ( 1 ) ;
57
57
expect ( unwatchedSpy ) . toBeCalledTimes ( 1 ) ;
58
58
} ) ;
59
+
60
+ it ( 'is possible to update a signal in the watch callback' , ( ) => {
61
+ const logs : string [ ] = [ ] ;
62
+ let indent = '' ;
63
+ const logFn = ( msg : string ) => ( ) => {
64
+ logs . push ( `${ indent } ${ msg } ` ) ;
65
+ } ;
66
+ const wrapFn =
67
+ < T > ( logMsg : string , fn : ( ) => T ) =>
68
+ ( ) : T => {
69
+ logs . push ( `${ indent } start ${ logMsg } ` ) ;
70
+ const prevIndent = indent ;
71
+ indent += ' ' ;
72
+ const res = fn ( ) ;
73
+ indent = prevIndent ;
74
+ logs . push ( `${ indent } end ${ logMsg } returning ${ res } ` ) ;
75
+ return res ;
76
+ } ;
77
+ const wrapComputed = < T > ( logMsg : string , fn : ( ) => T ) =>
78
+ new Signal . Computed ( wrapFn ( `${ logMsg } computing` , fn ) , {
79
+ [ Signal . subtle . watched ] : logFn ( `${ logMsg } watched` ) ,
80
+ [ Signal . subtle . unwatched ] : logFn ( `${ logMsg } unwatched` ) ,
81
+ } ) ;
82
+ const signal = new Signal . State ( 0 , {
83
+ [ Signal . subtle . watched ] : wrapFn ( 'signal watched' , ( ) => {
84
+ const value = signal . get ( ) + 1 ;
85
+ logs . push ( `${ indent } signal.set(${ value } )` ) ;
86
+ signal . set ( value ) ;
87
+ } ) ,
88
+ [ Signal . subtle . unwatched ] : logFn ( 'signal unwatched' ) ,
89
+ } ) ;
90
+ const dep1 = wrapComputed ( 'dep1' , ( ) => `${ signal . get ( ) } ,${ signal . get ( ) } ` ) ;
91
+ const dep2 = wrapComputed ( 'dep2' , ( ) => `${ signal . get ( ) } ,${ signal . get ( ) } ` ) ;
92
+ const dep3 = wrapComputed ( 'result' , ( ) => `${ dep1 . get ( ) } ,${ dep2 . get ( ) } ` ) ;
93
+
94
+ expect ( wrapFn ( 'signal.get 1' , ( ) => signal . get ( ) ) ( ) ) . toBe ( 1 ) ;
95
+ expect ( wrapFn ( 'signal.get 2' , ( ) => signal . get ( ) ) ( ) ) . toBe ( 2 ) ;
96
+ expect ( wrapFn ( 'dep1.get' , ( ) => dep1 . get ( ) ) ( ) ) . toBe ( '3,3' ) ;
97
+ expect ( wrapFn ( 'dep1.get' , ( ) => dep1 . get ( ) ) ( ) ) . toBe ( '4,4' ) ;
98
+ expect ( wrapFn ( 'dep2.get' , ( ) => dep2 . get ( ) ) ( ) ) . toBe ( '5,5' ) ;
99
+ expect ( wrapFn ( 'dep2.get' , ( ) => dep2 . get ( ) ) ( ) ) . toBe ( '6,6' ) ;
100
+ expect ( wrapFn ( 'dep3.get' , ( ) => dep3 . get ( ) ) ( ) ) . toBe ( '7,7,7,7' ) ;
101
+ expect ( wrapFn ( 'dep3.get' , ( ) => dep3 . get ( ) ) ( ) ) . toBe ( '8,8,8,8' ) ;
102
+ console . log ( logs ) ;
103
+ // expect(logs).toMatchInlineSnapshot();
104
+ } ) ;
59
105
} ) ;
0 commit comments