Skip to content

Commit

Permalink
chore: remove selector api (#9426)
Browse files Browse the repository at this point in the history
* chore: remove selector api
  • Loading branch information
trueadm committed Nov 13, 2023
1 parent 17e6c4f commit 5768df1
Show file tree
Hide file tree
Showing 8 changed files with 6 additions and 186 deletions.
5 changes: 5 additions & 0 deletions .changeset/chilly-dolphins-lick.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'svelte': patch
---

chore: remove selector api
99 changes: 0 additions & 99 deletions packages/svelte/src/internal/client/runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -1254,105 +1254,6 @@ export function set_signal_status(signal, status) {
}
}

/** @template V */
class Selector {
/** @type {Map<V, Set<import('./types.js').Signal>>} */
#consumers_map = new Map();

/** @type {import('./types.js').Signal<V | null>} */
#active_key;

/** @param {V | null} [key] */
constructor(key) {
this.#active_key = source(key || null);
}

get current() {
return get(this.#active_key);
}

/**
* @param {V | null} key
* @returns {void}
*/
set(key) {
const active_key = this.#active_key;
const previous_key = active_key.value;
if (previous_key === key) {
return;
}

set_signal_value(active_key, key);

const consumers_map = this.#consumers_map;
let consumers = map_get(consumers_map, /** @type {V} */ (previous_key));
if (consumers !== undefined) {
this.#update_consumers(consumers);
}

consumers = map_get(consumers_map, /** @type {V} */ (key));
if (consumers !== undefined) {
this.#update_consumers(consumers);
}
}

/**
* @param {Set<import('./types.js').Signal>} consumers
* @returns {void}
*/
#update_consumers(consumers) {
let consumer;
for (consumer of consumers) {
set_signal_status(consumer, DIRTY);
if ((consumer.flags & IS_EFFECT) !== 0) {
schedule_effect(/** @type {import('./types.js').EffectSignal} */ (consumer), false);
} else {
mark_signal_consumers(consumer, DIRTY, true);
}
}
}

/**
* @param {V} key
* @returns {boolean}
*/
is(key) {
const consumers_map = this.#consumers_map;
let consumers = map_get(consumers_map, key);
if (consumers === undefined) {
consumers = new Set();
map_set(consumers_map, key, consumers);
}

const consumer = current_consumer;
const effect = current_effect;
if (effect !== null && consumer !== null && !consumers.has(consumer)) {
consumers.add(consumer);
push_destroy_fn(effect, () => {
const consumers_set = /** @type {Set<import('./types.js').Signal>} */ (consumers);
consumers_set.delete(effect);
if (consumers_set.size === 0) {
map_delete(consumers_map, key);
}
});
}
return this.#active_key.value === key;
}
}

/**
* `selector` allows you to track the currently selected item in a list in a performance optimized manner
* that runs in constant time (O(1)) - this is only noticable for very large lists.
*
* https://svelte-5-preview.vercel.app/docs/functions#selector
* @template Key
* @param {Key | null} [key]
* @returns {Selector<Key>}
*/
export function selector(key) {
return new Selector(key);
}

/**
* @template V
* @param {V | import('./types.js').Signal<V>} val
Expand Down
1 change: 0 additions & 1 deletion packages/svelte/src/internal/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ export {
user_effect,
render_effect,
pre_effect,
selector,
flushSync,
bubble_event,
safe_equal,
Expand Down
10 changes: 1 addition & 9 deletions packages/svelte/src/main/main-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,12 +255,4 @@ export function afterUpdate(fn) {

// TODO bring implementations in here
// (except probably untrack — do we want to expose that, if there's also a rune?)
export {
flushSync,
createRoot,
mount,
tick,
untrack,
onDestroy,
selector
} from '../internal/index.js';
export { flushSync, createRoot, mount, tick, untrack, onDestroy } from '../internal/index.js';
1 change: 0 additions & 1 deletion packages/svelte/src/main/main-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export {
hasContext,
mount,
onDestroy,
selector,
setContext,
tick,
untrack
Expand Down
47 changes: 0 additions & 47 deletions packages/svelte/tests/runtime-runes/samples/selector/_config.js

This file was deleted.

11 changes: 0 additions & 11 deletions packages/svelte/tests/runtime-runes/samples/selector/main.svelte

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,3 @@ To prevent something from being treated as an `$effect`/`$derived` dependency, u
</script>
```

## `selector`

`selector` allows you to track the currently selected item in a list in a performance optimized manner that runs in constant time (`O(1)`). With `selector`, you can immediately determine if an item is selected:

```svelte
<script>
import { selector } from 'svelte';
let array = $state([1, 2, 3]);
let selected = selector();
</script>
{#each array as item}
<button on:click={() => selected.set(item)}>{selected.is(item)}</button>
{/each}
<p>{selected.current}</p>
```

1 comment on commit 5768df1

@vercel
Copy link

@vercel vercel bot commented on 5768df1 Nov 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

svelte-5-preview – ./sites/svelte-5-preview

svelte-octane.vercel.app
svelte-5-preview-git-main-svelte.vercel.app
svelte-5-preview-svelte.vercel.app
svelte-5-preview.vercel.app

Please sign in to comment.