Home / Function/ fork() — svelte Function Reference

fork() — svelte Function Reference

Architecture documentation for the fork() function in batch.js from the svelte codebase.

Entity Profile

Dependency Diagram

graph TD
  a967b3b9_6263_60ec_74ff_b1889e66d284["fork()"]
  d8e42d9d_2e3c_635c_19d3_b946a4341c0f["batch.js"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|defined in| d8e42d9d_2e3c_635c_19d3_b946a4341c0f
  b7967402_58f6_1459_b728_27d0f1118d87["fork_timing()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| b7967402_58f6_1459_b728_27d0f1118d87
  2ec0d2fd_8bbc_b2ba_53ae_f2da02bb3ba5["ensure()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 2ec0d2fd_8bbc_b2ba_53ae_f2da02bb3ba5
  00f10d2c_2e62_5eac_4978_67aef30d62bd["settled()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 00f10d2c_2e62_5eac_4978_67aef30d62bd
  5bc3c950_96f7_e454_6cb7_65ffc2179811["flushSync()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 5bc3c950_96f7_e454_6cb7_65ffc2179811
  6479f832_c1d7_7636_b658_b3f9c70d9af0["set_signal_status()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 6479f832_c1d7_7636_b658_b3f9c70d9af0
  16aac954_2fce_c7d9_4726_4ffecb0c6d64["fork_discarded()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 16aac954_2fce_c7d9_4726_4ffecb0c6d64
  4af42bfc_fe4c_0160_eada_7d109f39af3a["increment_write_version()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 4af42bfc_fe4c_0160_eada_7d109f39af3a
  92a6b0f5_8829_33ec_80dd_aa943970a578["eager()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 92a6b0f5_8829_33ec_80dd_aa943970a578
  8e91fdef_fe5d_43e3_f35f_46c69adf8c42["mark_eager_effects()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 8e91fdef_fe5d_43e3_f35f_46c69adf8c42
  b9061456_b6fe_b159_6713_beff0afbb7a4["set_eager_effects()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| b9061456_b6fe_b159_6713_beff0afbb7a4
  8cbd2617_a90a_da93_cf30_82f21876749c["flush_eager_effects()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 8cbd2617_a90a_da93_cf30_82f21876749c
  4a5c85d2_dfaa_8eed_83a2_1b140cad91fb["revive()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 4a5c85d2_dfaa_8eed_83a2_1b140cad91fb
  3a656fc9_97e1_c1e1_53aa_c39cb7503b64["discard()"]
  a967b3b9_6263_60ec_74ff_b1889e66d284 -->|calls| 3a656fc9_97e1_c1e1_53aa_c39cb7503b64
  style a967b3b9_6263_60ec_74ff_b1889e66d284 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/svelte/src/internal/client/reactivity/batch.js lines 971–1056

export function fork(fn) {
	if (!async_mode_flag) {
		e.experimental_async_required('fork');
	}

	if (current_batch !== null) {
		e.fork_timing();
	}

	var batch = Batch.ensure();
	batch.is_fork = true;
	batch_values = new Map();

	var committed = false;
	var settled = batch.settled();

	flushSync(fn);

	// revert state changes
	for (var [source, value] of batch.previous) {
		source.v = value;
	}

	// make writable deriveds dirty, so they recalculate correctly
	for (source of batch.current.keys()) {
		if ((source.f & DERIVED) !== 0) {
			set_signal_status(source, DIRTY);
		}
	}

	return {
		commit: async () => {
			if (committed) {
				await settled;
				return;
			}

			if (!batches.has(batch)) {
				e.fork_discarded();
			}

			committed = true;

			batch.is_fork = false;

			// apply changes and update write versions so deriveds see the change
			for (var [source, value] of batch.current) {
				source.v = value;
				source.wv = increment_write_version();
			}

			// trigger any `$state.eager(...)` expressions with the new state.
			// eager effects don't get scheduled like other effects, so we
			// can't just encounter them during traversal, we need to
			// proactively flush them
			// TODO maybe there's a better implementation?
			flushSync(() => {
				/** @type {Set<Effect>} */
				var eager_effects = new Set();

				for (var source of batch.current.keys()) {
					mark_eager_effects(source, eager_effects);
				}

				set_eager_effects(eager_effects);
				flush_eager_effects();
			});

			batch.revive();
			await settled;
		},
		discard: () => {
			// cause any MAYBE_DIRTY deriveds to update
			// if they depend on things thath changed
			// inside the discarded fork
			for (var source of batch.current.keys()) {
				source.wv = increment_write_version();
			}

			if (!committed && batches.has(batch)) {
				batches.delete(batch);

Domain

Subdomains

Frequently Asked Questions

What does fork() do?
fork() is a function in the svelte codebase, defined in packages/svelte/src/internal/client/reactivity/batch.js.
Where is fork() defined?
fork() is defined in packages/svelte/src/internal/client/reactivity/batch.js at line 971.
What does fork() call?
fork() calls 13 function(s): discard, eager, ensure, flushSync, flush_eager_effects, fork_discarded, fork_timing, increment_write_version, and 5 more.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free