avoid GC in signal/effect
This commit is contained in:
@@ -4,17 +4,22 @@ let current: Current = null;
|
||||
|
||||
export function createSignal<T>(value: T): [() => T, (value: T) => void] {
|
||||
let innerValue = value;
|
||||
const observers = new Set<() => void>();
|
||||
const observers: Array<Current> = [];
|
||||
const indices = new Map<Current, number>();
|
||||
|
||||
const getter = () => {
|
||||
current !== null && observers.add(current);
|
||||
if (current !== null && !indices.has(current)) {
|
||||
observers.push(current);
|
||||
indices.set(current, observers.length);
|
||||
}
|
||||
|
||||
return innerValue;
|
||||
};
|
||||
|
||||
const setter = (value: T) => {
|
||||
innerValue = value;
|
||||
for (const observer of observers) {
|
||||
observer();
|
||||
for (let i = 0; i < observers.length; i++) {
|
||||
observers[i]!();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user