UNPKG

@dhmk/zustand-lens

Version:

Lens support for zustand

77 lines (76 loc) 3.21 kB
import { mergeDeep, objectMap, isPlainObject } from "@dhmk/utils"; export { mergeDeep } from "@dhmk/utils"; export var mergeDeepLeft = function (a, b) { return mergeDeep(b, a); }; export var customSetter = function (setter) { return function (fn) { return function (set, get, api, ctx) { return fn(setter(set), get, api, ctx); }; }; }; export var namedSetter = customSetter(function (set) { return function (partial, name, replace) { return set(partial, replace, name); }; }); export function subscribe(store, selector, effect, options) { if (options === void 0) { options = {}; } var _a = options.equalityFn, equalityFn = _a === void 0 ? Object.is : _a, _b = options.fireImmediately, fireImmediately = _b === void 0 ? false : _b; var curr = selector(store.getState()); if (fireImmediately) effect(curr, curr); return store.subscribe(function (state) { var next = selector(state); if (!equalityFn(next, curr)) { var prev = curr; effect((curr = next), prev); } }); } export function watch(selector, effect, options) { if (options === void 0) { options = {}; } var _a = options.equalityFn, equalityFn = _a === void 0 ? Object.is : _a, _b = options.fireImmediately, fireImmediately = _b === void 0 ? false : _b; var curr; if (fireImmediately) effect(undefined, undefined); return function (set, ctx) { if (!curr) curr = selector(ctx.get()); set(); var next = selector(ctx.get()); if (!equalityFn(next, curr)) { var prev = curr; effect((curr = next), prev); } }; } export function combineWatchers() { var fns = []; for (var _i = 0; _i < arguments.length; _i++) { fns[_i] = arguments[_i]; } var initialized; var runWatchers = function (ctx) { return fns.forEach(function (fn) { return fn(function () { }, ctx); }); }; return function (set, ctx) { if (!initialized) { initialized = true; runWatchers(ctx); } set(); runWatchers(ctx); }; } var persist = Symbol("persist"); export function persistOptions(conf) { var _a; return _a = {}, _a[persist] = conf, _a; } function walk(x, fn) { return isPlainObject(x) ? objectMap(fn(x), function (v) { return walk(v, fn); }) : x; } var zustandPersistOptions = { merge: function (persistedState, currentState) { if (persistedState === void 0) { persistedState = {}; } return walk(mergeDeep(currentState, persistedState), function (x) { var _a, _b, _c; return (_c = (_b = (_a = x[persist]) === null || _a === void 0 ? void 0 : _a.load) === null || _b === void 0 ? void 0 : _b.call(_a, x)) !== null && _c !== void 0 ? _c : x; }); }, partialize: function (state) { return walk(state, function (x) { var _a, _b, _c; return (_c = (_b = (_a = x[persist]) === null || _a === void 0 ? void 0 : _a.save) === null || _b === void 0 ? void 0 : _b.call(_a, x)) !== null && _c !== void 0 ? _c : x; }); }, }; // for typescript persistOptions.merge = zustandPersistOptions.merge; persistOptions.partialize = zustandPersistOptions.partialize;