Skip to content

Commit 5768df1

Browse files
authored
chore: remove selector api (#9426)
* chore: remove selector api
1 parent 17e6c4f commit 5768df1

File tree

8 files changed

+6
-186
lines changed

8 files changed

+6
-186
lines changed

.changeset/chilly-dolphins-lick.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
chore: remove selector api

packages/svelte/src/internal/client/runtime.js

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,105 +1254,6 @@ export function set_signal_status(signal, status) {
12541254
}
12551255
}
12561256

1257-
/** @template V */
1258-
class Selector {
1259-
/** @type {Map<V, Set<import('./types.js').Signal>>} */
1260-
#consumers_map = new Map();
1261-
1262-
/** @type {import('./types.js').Signal<V | null>} */
1263-
#active_key;
1264-
1265-
/** @param {V | null} [key] */
1266-
constructor(key) {
1267-
this.#active_key = source(key || null);
1268-
}
1269-
1270-
get current() {
1271-
return get(this.#active_key);
1272-
}
1273-
1274-
/**
1275-
* @param {V | null} key
1276-
* @returns {void}
1277-
*/
1278-
set(key) {
1279-
const active_key = this.#active_key;
1280-
const previous_key = active_key.value;
1281-
if (previous_key === key) {
1282-
return;
1283-
}
1284-
1285-
set_signal_value(active_key, key);
1286-
1287-
const consumers_map = this.#consumers_map;
1288-
let consumers = map_get(consumers_map, /** @type {V} */ (previous_key));
1289-
if (consumers !== undefined) {
1290-
this.#update_consumers(consumers);
1291-
}
1292-
1293-
consumers = map_get(consumers_map, /** @type {V} */ (key));
1294-
if (consumers !== undefined) {
1295-
this.#update_consumers(consumers);
1296-
}
1297-
}
1298-
1299-
/**
1300-
* @param {Set<import('./types.js').Signal>} consumers
1301-
* @returns {void}
1302-
*/
1303-
#update_consumers(consumers) {
1304-
let consumer;
1305-
for (consumer of consumers) {
1306-
set_signal_status(consumer, DIRTY);
1307-
if ((consumer.flags & IS_EFFECT) !== 0) {
1308-
schedule_effect(/** @type {import('./types.js').EffectSignal} */ (consumer), false);
1309-
} else {
1310-
mark_signal_consumers(consumer, DIRTY, true);
1311-
}
1312-
}
1313-
}
1314-
1315-
/**
1316-
* @param {V} key
1317-
* @returns {boolean}
1318-
*/
1319-
is(key) {
1320-
const consumers_map = this.#consumers_map;
1321-
let consumers = map_get(consumers_map, key);
1322-
if (consumers === undefined) {
1323-
consumers = new Set();
1324-
map_set(consumers_map, key, consumers);
1325-
}
1326-
1327-
const consumer = current_consumer;
1328-
const effect = current_effect;
1329-
if (effect !== null && consumer !== null && !consumers.has(consumer)) {
1330-
consumers.add(consumer);
1331-
push_destroy_fn(effect, () => {
1332-
const consumers_set = /** @type {Set<import('./types.js').Signal>} */ (consumers);
1333-
consumers_set.delete(effect);
1334-
if (consumers_set.size === 0) {
1335-
map_delete(consumers_map, key);
1336-
}
1337-
});
1338-
}
1339-
return this.#active_key.value === key;
1340-
}
1341-
}
1342-
1343-
/**
1344-
* `selector` allows you to track the currently selected item in a list in a performance optimized manner
1345-
* that runs in constant time (O(1)) - this is only noticable for very large lists.
1346-
*
1347-
* https://svelte-5-preview.vercel.app/docs/functions#selector
1348-
* @template Key
1349-
* @param {Key | null} [key]
1350-
* @returns {Selector<Key>}
1351-
*/
1352-
export function selector(key) {
1353-
return new Selector(key);
1354-
}
1355-
13561257
/**
13571258
* @template V
13581259
* @param {V | import('./types.js').Signal<V>} val

packages/svelte/src/internal/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ export {
1313
user_effect,
1414
render_effect,
1515
pre_effect,
16-
selector,
1716
flushSync,
1817
bubble_event,
1918
safe_equal,

packages/svelte/src/main/main-client.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,4 @@ export function afterUpdate(fn) {
255255

256256
// TODO bring implementations in here
257257
// (except probably untrack — do we want to expose that, if there's also a rune?)
258-
export {
259-
flushSync,
260-
createRoot,
261-
mount,
262-
tick,
263-
untrack,
264-
onDestroy,
265-
selector
266-
} from '../internal/index.js';
258+
export { flushSync, createRoot, mount, tick, untrack, onDestroy } from '../internal/index.js';

packages/svelte/src/main/main-server.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ export {
77
hasContext,
88
mount,
99
onDestroy,
10-
selector,
1110
setContext,
1211
tick,
1312
untrack

packages/svelte/tests/runtime-runes/samples/selector/_config.js

Lines changed: 0 additions & 47 deletions
This file was deleted.

packages/svelte/tests/runtime-runes/samples/selector/main.svelte

Lines changed: 0 additions & 11 deletions
This file was deleted.

sites/svelte-5-preview/src/routes/docs/content/01-api/03-functions.md

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,3 @@ To prevent something from being treated as an `$effect`/`$derived` dependency, u
2323
</script>
2424
```
2525

26-
## `selector`
27-
28-
`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:
29-
30-
```svelte
31-
<script>
32-
import { selector } from 'svelte';
33-
34-
let array = $state([1, 2, 3]);
35-
let selected = selector();
36-
</script>
37-
38-
{#each array as item}
39-
<button on:click={() => selected.set(item)}>{selected.is(item)}</button>
40-
{/each}
41-
42-
<p>{selected.current}</p>
43-
```

0 commit comments

Comments
 (0)