Home / Class/ Memoizer Class — svelte Architecture

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

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