@@ -105,6 +105,7 @@ export class Derived<
105105 registerOnGraph (
106106 deps : ReadonlyArray < Derived < any > | Store < any > > = this . options . deps ,
107107 ) {
108+ const toSort = new Set < Array < Derived < unknown > > > ( )
108109 for ( const dep of deps ) {
109110 if ( dep instanceof Derived ) {
110111 // First register the intermediate derived value if it's not already registered
@@ -115,10 +116,12 @@ export class Derived<
115116 // Register the derived as related derived to the store
116117 let relatedLinkedDerivedVals = __storeToDerived . get ( dep )
117118 if ( ! relatedLinkedDerivedVals ) {
118- relatedLinkedDerivedVals = new Set ( )
119+ relatedLinkedDerivedVals = [ this as never ]
119120 __storeToDerived . set ( dep , relatedLinkedDerivedVals )
121+ } else if ( ! relatedLinkedDerivedVals . includes ( this as never ) ) {
122+ relatedLinkedDerivedVals . push ( this as never )
123+ toSort . add ( relatedLinkedDerivedVals )
120124 }
121- relatedLinkedDerivedVals . add ( this as never )
122125
123126 // Register the store as a related store to this derived
124127 let relatedStores = __derivedToStore . get ( this as never )
@@ -129,6 +132,16 @@ export class Derived<
129132 relatedStores . add ( dep )
130133 }
131134 }
135+ for ( const arr of toSort ) {
136+ // First sort deriveds by dependency order
137+ arr . sort ( ( a , b ) => {
138+ // If a depends on b, b should go first
139+ if ( a instanceof Derived && a . options . deps . includes ( b ) ) return 1
140+ // If b depends on a, a should go first
141+ if ( b instanceof Derived && b . options . deps . includes ( a ) ) return - 1
142+ return 0
143+ } )
144+ }
132145 }
133146
134147 unregisterFromGraph (
@@ -140,7 +153,10 @@ export class Derived<
140153 } else if ( dep instanceof Store ) {
141154 const relatedLinkedDerivedVals = __storeToDerived . get ( dep )
142155 if ( relatedLinkedDerivedVals ) {
143- relatedLinkedDerivedVals . delete ( this as never )
156+ relatedLinkedDerivedVals . splice (
157+ relatedLinkedDerivedVals . indexOf ( this as never ) ,
158+ 1 ,
159+ )
144160 }
145161
146162 const relatedStores = __derivedToStore . get ( this as never )
0 commit comments