|
|
|
|
@ -42,6 +42,11 @@ export function derived(fn) {
|
|
|
|
|
active_effect.f |= EFFECT_HAS_DERIVED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var parent_derived =
|
|
|
|
|
active_reaction !== null && (active_reaction.f & DERIVED) !== 0
|
|
|
|
|
? /** @type {Derived} */ (active_reaction)
|
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
/** @type {Derived<V>} */
|
|
|
|
|
const signal = {
|
|
|
|
|
children: null,
|
|
|
|
|
@ -53,12 +58,11 @@ export function derived(fn) {
|
|
|
|
|
reactions: null,
|
|
|
|
|
v: /** @type {V} */ (null),
|
|
|
|
|
version: 0,
|
|
|
|
|
parent: active_effect
|
|
|
|
|
parent: parent_derived || active_effect
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0) {
|
|
|
|
|
var derived = /** @type {Derived} */ (active_reaction);
|
|
|
|
|
(derived.children ??= []).push(signal);
|
|
|
|
|
if (parent_derived !== null) {
|
|
|
|
|
(parent_derived.children ??= []).push(signal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return signal;
|
|
|
|
|
@ -104,6 +108,21 @@ function destroy_derived_children(derived) {
|
|
|
|
|
*/
|
|
|
|
|
let stack = [];
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {Derived} derived
|
|
|
|
|
* @returns {Effect | null}
|
|
|
|
|
*/
|
|
|
|
|
export function get_derived_parent_effect(derived) {
|
|
|
|
|
var parent = derived.parent;
|
|
|
|
|
if (parent !== null) {
|
|
|
|
|
if ((parent.f & DERIVED) === 0) {
|
|
|
|
|
return /** @type {Effect} */ (parent);
|
|
|
|
|
}
|
|
|
|
|
parent = parent.parent;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @template T
|
|
|
|
|
* @param {Derived} derived
|
|
|
|
|
@ -113,7 +132,7 @@ export function execute_derived(derived) {
|
|
|
|
|
var value;
|
|
|
|
|
var prev_active_effect = active_effect;
|
|
|
|
|
|
|
|
|
|
set_active_effect(derived.parent);
|
|
|
|
|
set_active_effect(get_derived_parent_effect(derived));
|
|
|
|
|
|
|
|
|
|
if (DEV) {
|
|
|
|
|
let prev_inspect_effects = inspect_effects;
|
|
|
|
|
@ -162,14 +181,13 @@ export function update_derived(derived) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {Derived} signal
|
|
|
|
|
* @param {Derived} derived
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
export function destroy_derived(signal) {
|
|
|
|
|
destroy_derived_children(signal);
|
|
|
|
|
remove_reactions(signal, 0);
|
|
|
|
|
set_signal_status(signal, DESTROYED);
|
|
|
|
|
export function destroy_derived(derived) {
|
|
|
|
|
destroy_derived_children(derived);
|
|
|
|
|
remove_reactions(derived, 0);
|
|
|
|
|
set_signal_status(derived, DESTROYED);
|
|
|
|
|
|
|
|
|
|
// TODO we need to ensure we remove the derived from any parent derives
|
|
|
|
|
signal.v = signal.children = signal.deps = signal.ctx = signal.reactions = null;
|
|
|
|
|
derived.v = derived.children = derived.deps = derived.ctx = derived.reactions = null;
|
|
|
|
|
}
|
|
|
|
|
|