@@ -3,14 +3,14 @@ import { CLEAN, DERIVED, DESTROYED, DIRTY, MAYBE_DIRTY, UNOWNED } from '../const
33import {
44 current_reaction ,
55 current_effect ,
6- destroy_children ,
76 remove_reactions ,
87 set_signal_status ,
98 mark_reactions ,
109 current_skip_reaction ,
1110 execute_reaction_fn
1211} from '../runtime.js' ;
1312import { equals , safe_equals } from './equality.js' ;
13+ import { destroy_effect } from './effects.js' ;
1414
1515export let updating_derived = false ;
1616
@@ -42,10 +42,11 @@ export function derived(fn) {
4242 }
4343
4444 if ( current_reaction !== null && ( current_reaction . f & DERIVED ) !== 0 ) {
45- if ( current_reaction . deriveds === null ) {
46- current_reaction . deriveds = [ signal ] ;
45+ var current_derived = /** @type {import('#client').Derived<V> } */ ( current_reaction ) ;
46+ if ( current_derived . deriveds === null ) {
47+ current_derived . deriveds = [ signal ] ;
4748 } else {
48- current_reaction . deriveds . push ( signal ) ;
49+ current_derived . deriveds . push ( signal ) ;
4950 }
5051 }
5152
@@ -64,6 +65,27 @@ export function derived_safe_equal(fn) {
6465 return signal ;
6566}
6667
68+ /**
69+ * @param {import('./types.js').Derived } signal
70+ * @returns {void }
71+ */
72+ function destroy_derived_children ( signal ) {
73+ // TODO: should it be possible to create effects in deriveds given they're meant to be pure?
74+ if ( signal . effects ) {
75+ for ( var i = 0 ; i < signal . effects . length ; i += 1 ) {
76+ destroy_effect ( signal . effects [ i ] ) ;
77+ }
78+ signal . effects = null ;
79+ }
80+
81+ if ( signal . deriveds ) {
82+ for ( i = 0 ; i < signal . deriveds . length ; i += 1 ) {
83+ destroy_derived ( signal . deriveds [ i ] ) ;
84+ }
85+ signal . deriveds = null ;
86+ }
87+ }
88+
6789/**
6890 * @param {import('#client').Derived } derived
6991 * @param {boolean } force_schedule
@@ -72,7 +94,7 @@ export function derived_safe_equal(fn) {
7294export function update_derived ( derived , force_schedule ) {
7395 var previous_updating_derived = updating_derived ;
7496 updating_derived = true ;
75- destroy_children ( derived ) ;
97+ destroy_derived_children ( derived ) ;
7698 var value = execute_reaction_fn ( derived ) ;
7799 updating_derived = previous_updating_derived ;
78100
@@ -98,7 +120,7 @@ export function update_derived(derived, force_schedule) {
98120 * @returns {void }
99121 */
100122export function destroy_derived ( signal ) {
101- destroy_children ( signal ) ;
123+ destroy_derived_children ( signal ) ;
102124 remove_reactions ( signal , 0 ) ;
103125 set_signal_status ( signal , DESTROYED ) ;
104126
0 commit comments