1- import type { BaseLink , Consumer , RawStore } from './store' ;
1+ import { getActiveConsumer , setActiveConsumer , type Signal } from '../interop' ;
2+ import type { BaseLink , Consumer , RawStore , TansuInteropConsumer } from './store' ;
23import { RawStoreFlags , updateLinkProducerValue } from './store' ;
34import {
45 COMPUTED_ERRORED ,
56 COMPUTED_UNSET ,
67 RawStoreComputedOrDerived ,
78} from './storeComputedOrDerived' ;
9+ import { fromInteropSignal } from './storeFromWatch' ;
810import { epoch , notificationPhase } from './storeWritable' ;
9- import { activeConsumer , setActiveConsumer , type ActiveConsumer } from './untrack' ;
1011
1112export class RawStoreComputed < T >
1213 extends RawStoreComputedOrDerived < T >
13- implements Consumer , ActiveConsumer
14+ implements Consumer , TansuInteropConsumer
1415{
1516 private producerIndex = 0 ;
1617 private producerLinks : BaseLink < any > [ ] = [ ] ;
@@ -26,30 +27,41 @@ export class RawStoreComputed<T>
2627
2728 override updateValue ( ) : void {
2829 const flags = this . flags ;
29- if ( flags & RawStoreFlags . START_USE_CALLED && this . epoch === epoch ) {
30+ if (
31+ flags & RawStoreFlags . START_USE_CALLED &&
32+ ! ( flags & RawStoreFlags . DIRTY ) &&
33+ ! ( flags & RawStoreFlags . COMPUTING )
34+ ) {
3035 return ;
3136 }
3237 super . updateValue ( ) ;
3338 this . epoch = epoch ;
3439 }
3540
3641 override get ( ) : T {
42+ // FIXME: better test all cases of this optimization:
43+ const flags = this . flags ;
3744 if (
38- ! activeConsumer &&
45+ ! getActiveConsumer ( ) &&
3946 ! notificationPhase &&
40- this . epoch === epoch &&
41- ( ! ( this . flags & RawStoreFlags . HAS_VISIBLE_ONUSE ) ||
42- this . flags & RawStoreFlags . START_USE_CALLED )
47+ ! ( flags & RawStoreFlags . COMPUTING ) &&
48+ ! ( flags & RawStoreFlags . DIRTY ) &&
49+ ( flags & RawStoreFlags . START_USE_CALLED ||
50+ ( this . epoch === epoch && ! ( flags & RawStoreFlags . HAS_VISIBLE_ONUSE ) ) )
4351 ) {
4452 return this . readValue ( ) ;
4553 }
4654 return super . get ( ) ;
4755 }
4856
49- addProducer < U , L extends BaseLink < U > > ( producer : RawStore < U , L > ) : U {
57+ addProducer ( signal : Signal ) : void {
58+ this . addTansuProducer ( fromInteropSignal ( signal ) ) ;
59+ }
60+
61+ addTansuProducer < U > ( producer : RawStore < U > ) : void {
5062 const producerLinks = this . producerLinks ;
5163 const producerIndex = this . producerIndex ;
52- let link = producerLinks [ producerIndex ] as L | undefined ;
64+ let link = producerLinks [ producerIndex ] as BaseLink < U > | undefined ;
5365 if ( link ?. producer !== producer ) {
5466 if ( link ) {
5567 producerLinks . push ( link ) ; // push the existing link at the end (to be removed later)
@@ -62,7 +74,7 @@ export class RawStoreComputed<T>
6274 if ( producer . flags & RawStoreFlags . HAS_VISIBLE_ONUSE ) {
6375 this . flags |= RawStoreFlags . HAS_VISIBLE_ONUSE ;
6476 }
65- return producer . updateLink ( link ) ;
77+ producer . updateLink ( link ) ;
6678 }
6779
6880 override startUse ( ) : void {
0 commit comments