UNPKG

@event-calendar/core

Version:

Full-sized drag & drop event calendar with resource & timeline views

49 lines (45 loc) 1.25 kB
import {hasOwn} from '#lib'; /** * Array proxy that triggers the effect on any assignment to first-level elements or length property */ export function arrayProxy(array) { let counter = 0; let version = $state(counter); return proxy( array, () => version, () => true, () => version = ++counter ); } /** * Object proxy that triggers the effect on changes to first-level properties */ export function objectProxy(object) { let counter = 0; let versions = $state({}); return proxy( object, prop => versions[prop], (a, b) => a !== b, prop => versions[prop] = ++counter ); } function proxy(target, setDependency, hasEffect, invokeEffect) { return new Proxy(target, { get(target, prop, receiver) { if (hasOwn(target, prop)) { setDependency(prop); } return Reflect.get(target, prop, receiver); }, set(target, prop, value, receiver) { let has = hasEffect(target[prop], value); let result = Reflect.set(target, prop, value, receiver); if (has) { invokeEffect(prop); } return result; } }); }