import { toRef as toRef$1, readonly, ref, customRef, unref, isRef, watch } from 'vue'; function computedWithControl(source, fn) { let v = void 0; let track; let trigger; const dirty = ref(true); const update = () => { dirty.value = true; trigger(); }; watch(source, update, { flush: "sync" }); const get2 = typeof fn === "function" ? fn : fn.get; const set2 = typeof fn === "function" ? void 0 : fn.set; const result = customRef((_track, _trigger) => { track = _track; trigger = _trigger; return { get() { if (dirty.value) { v = get2(); dirty.value = false; } track(); return v; }, set(v2) { set2 == null ? void 0 : set2(v2); } }; }); if (Object.isExtensible(result)) result.trigger = update; return result; } function toValue(r) { return typeof r === "function" ? r() : unref(r); } typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope; const noop = () => { }; function createFilterWrapper(filter, fn) { function wrapper(...args) { return new Promise((resolve, reject) => { Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject); }); } return wrapper; } const bypassFilter = (invoke2) => { return invoke2(); }; function pausableFilter(extendFilter = bypassFilter) { const isActive = ref(true); function pause() { isActive.value = false; } function resume() { isActive.value = true; } const eventFilter = (...args) => { if (isActive.value) extendFilter(...args); }; return { isActive: readonly(isActive), pause, resume, eventFilter }; } function toRef(...args) { if (args.length !== 1) return toRef$1(...args); const r = args[0]; return typeof r === "function" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r); } function watchWithFilter(source, cb, options = {}) { const { eventFilter = bypassFilter, ...watchOptions } = options; return watch( source, createFilterWrapper( eventFilter, cb ), watchOptions ); } function watchPausable(source, cb, options = {}) { const { eventFilter: filter, ...watchOptions } = options; const { eventFilter, pause, resume, isActive } = pausableFilter(filter); const stop = watchWithFilter( source, cb, { ...watchOptions, eventFilter } ); return { stop, pause, resume, isActive }; } function syncRef(left, right, ...[options]) { const { flush = "sync", deep = false, immediate = true, direction = "both", transform = {} } = options || {}; const watchers = []; const transformLTR = "ltr" in transform && transform.ltr || ((v) => v); const transformRTL = "rtl" in transform && transform.rtl || ((v) => v); if (direction === "both" || direction === "ltr") { watchers.push(watchPausable( left, (newValue) => { watchers.forEach((w) => w.pause()); right.value = transformLTR(newValue); watchers.forEach((w) => w.resume()); }, { flush, deep, immediate } )); } if (direction === "both" || direction === "rtl") { watchers.push(watchPausable( right, (newValue) => { watchers.forEach((w) => w.pause()); left.value = transformRTL(newValue); watchers.forEach((w) => w.resume()); }, { flush, deep, immediate } )); } const stop = () => { watchers.forEach((w) => w.stop()); }; return stop; } function useToggle(initialValue = false, options = {}) { const { truthyValue = true, falsyValue = false } = options; const valueIsRef = isRef(initialValue); const _value = ref(initialValue); function toggle(value) { if (arguments.length) { _value.value = value; return _value.value; } else { const truthy = toValue(truthyValue); _value.value = _value.value === truthy ? toValue(falsyValue) : truthy; return _value.value; } } if (valueIsRef) return toggle; else return [_value, toggle]; } export { toValue as a, computedWithControl as c, syncRef as s, toRef as t, useToggle as u };