Memoizer Class — svelte Architecture
Architecture documentation for the Memoizer class in utils.js from the svelte codebase.
Entity Profile
Dependency Diagram
graph TD be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1["Memoizer"] d04d7971_88df_542d_dd4f_26170ce6f581["utils.js"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|defined in| d04d7971_88df_542d_dd4f_26170ce6f581 5ff7d39f_78e8_c057_8c8e_279f6e72149e["add()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 5ff7d39f_78e8_c057_8c8e_279f6e72149e 2cbdb96a_8cdf_2a80_c6c4_74090309d76b["check_blockers()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 2cbdb96a_8cdf_2a80_c6c4_74090309d76b 10046df1_7862_0e3a_2d28_14faf64ff123["apply()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 10046df1_7862_0e3a_2d28_14faf64ff123 c8d80c9d_ab6c_13c0_c85e_a9b120f82f45["blockers()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| c8d80c9d_ab6c_13c0_c85e_a9b120f82f45 c2ad0578_181a_4701_2788_ba3b9ab69623["deriveds()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| c2ad0578_181a_4701_2788_ba3b9ab69623 0ded3b0c_d77a_8cc1_be19_72a1a33537da["async_ids()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 0ded3b0c_d77a_8cc1_be19_72a1a33537da 3c8a9b45_1c84_b995_7438_57a8885c67ba["async_values()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 3c8a9b45_1c84_b995_7438_57a8885c67ba 6f7809e4_1338_fe87_a5b2_2bb5d1626fdf["sync_values()"] be60a9d7_77eb_5ad3_ab7e_2f9bd93a3db1 -->|method| 6f7809e4_1338_fe87_a5b2_2bb5d1626fdf
Relationship Graph
Source Code
packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js lines 18–92
export class Memoizer {
/** @type {Array<{ id: Identifier, expression: Expression }>} */
#sync = [];
/** @type {Array<{ id: Identifier, expression: Expression }>} */
#async = [];
/** @type {Set<Expression>} */
#blockers = new Set();
/**
* @param {Expression} expression
* @param {ExpressionMetadata} metadata
* @param {boolean} memoize_if_state
*/
add(expression, metadata, memoize_if_state = false) {
this.check_blockers(metadata);
const should_memoize =
metadata.has_call || metadata.has_await || (memoize_if_state && metadata.has_state);
if (!should_memoize) {
// no memoization required
return expression;
}
const id = b.id('#'); // filled in later
(metadata.has_await ? this.#async : this.#sync).push({ id, expression });
return id;
}
/**
* @param {ExpressionMetadata} metadata
*/
check_blockers(metadata) {
for (const binding of metadata.dependencies) {
if (binding.blocker) {
this.#blockers.add(binding.blocker);
}
}
}
apply() {
return [...this.#sync, ...this.#async].map((memo, i) => {
memo.id.name = `$${i}`;
return memo.id;
});
}
blockers() {
return this.#blockers.size > 0 ? b.array([...this.#blockers]) : undefined;
}
deriveds(runes = true) {
return this.#sync.map((memo) =>
b.let(memo.id, b.call(runes ? '$.derived' : '$.derived_safe_equal', b.thunk(memo.expression)))
);
}
async_ids() {
return this.#async.map((memo) => memo.id);
}
async_values() {
if (this.#async.length === 0) return;
return b.array(this.#async.map((memo) => b.thunk(memo.expression, true)));
}
sync_values() {
if (this.#sync.length === 0) return;
return b.array(this.#sync.map((memo) => b.thunk(memo.expression)));
}
}
Domain
Source
Frequently Asked Questions
What is the Memoizer class?
Memoizer is a class in the svelte codebase, defined in packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js.
Where is Memoizer defined?
Memoizer is defined in packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js at line 18.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free