@dhmk/zustand-lens
Version:
Lens support for zustand
77 lines (76 loc) • 3.21 kB
JavaScript
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;