@constellar/core
Version:
state manipulation primitives
787 lines (786 loc) • 17.3 kB
JavaScript
var T = Object.defineProperty;
var U = (t, e, n) => e in t ? T(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;
var l = (t, e, n) => U(t, typeof e != "symbol" ? e + "" : e, n);
function F(t) {
return typeof t == "string" ? (
// Sendable type guarantees that resulting event is valid
{ type: t }
) : t;
}
function me(t) {
return (e) => t(F(e));
}
function z(t, e) {
return [t, ...e];
}
function j(t, e) {
return [...e, t];
}
function he(t, e, n) {
return t < 0 && (t += n.length), t < 0 || t > n.length ? n : [...n.slice(0, t), e, ...n.slice(t)];
}
function I(t, e, n) {
return e < 0 && (e += n.length), e < 0 || e >= n.length || Object.is(n[e], t) ? n : [...n.slice(0, e), t, ...n.slice(e + 1)];
}
function G(t, e) {
return t < 0 && (t += e.length), t < 0 || t >= e.length ? e : [...e.slice(0, t), ...e.slice(t + 1)];
}
function J(t, e) {
for (const n of e)
if (Object.is(n, t)) return e;
return e.concat(t);
}
function K(t, e) {
let n = !1;
const r = [];
for (const i of e)
Object.is(i, t) ? n = !0 : r.push(i);
return n ? r : e;
}
function pe(t, ...e) {
return e.reduce((n, r) => r(n), t);
}
function g(t) {
return typeof t == "function";
}
function w(t) {
return t === void 0;
}
function m(t) {
return !1;
}
const N = () => {
};
function k(t, e) {
return t(e);
}
function c(t) {
return t;
}
function E(t, e) {
return t === c ? e : e === c ? t : (n) => e(t(n));
}
function S(t) {
return g(t) ? t() : t;
}
function V(t) {
return g(t) ? (e) => t(e) : () => t;
}
function Q(t) {
if (!t) return !0;
for (const e of Object.keys(t))
return !1;
return !0;
}
function ge(t) {
return function(e) {
return function(...n) {
return t(e, ...n);
};
};
}
function Fe(t, ...e) {
return (...n) => t(...e, ...n);
}
function be(t, ...e) {
return e.reduce((n, r) => (i) => r(n(i)), t);
}
function W(t, e) {
if (t === e)
return !0;
if (!(t instanceof Object) || !(e instanceof Object))
return !1;
let n = 0, r = 0;
for (const i in t)
if (n += 1, !Object.is(t[i], e[i]) || !(i in e))
return !1;
for (const i in e)
r += 1;
return n === r;
}
class X {
constructor(e) {
l(this, "last", /* @__PURE__ */ new Map());
this.effectsHandlers = e;
}
foldSubState(e) {
return (n, r, i) => {
var f, u;
if (this.effectsHandlers === void 0) return r;
r.add(i);
for (const s of Object.entries(this.effectsHandlers)) {
const [o, a] = s, h = (f = n.effects) == null ? void 0 : f[o];
let d = this.last.get(i);
d || (d = /* @__PURE__ */ new Map(), this.last.set(i, d));
const p = d.get(o);
W(p == null ? void 0 : p.args, h) || ((u = p == null ? void 0 : p.unmount) == null || u.call(p), d.set(o, {
args: h,
unmount: h === void 0 ? void 0 : a(h, e)
}));
}
return r;
};
}
flush(e) {
this.last.forEach((n, r) => {
e != null && e.has(r) || (n.forEach(({ unmount: i }) => i == null ? void 0 : i()), n.clear());
});
}
update(e, n) {
this.flush(e(this.foldSubState(n), /* @__PURE__ */ new Set()));
}
}
function Y(t) {
return g(t) ? (e) => t(F(e)) : (e) => {
const n = F(e);
t[n.type](n);
};
}
function ve() {
return Z();
}
function Z() {
return function({ derive: t, init: e, states: n }) {
const r = V(e);
function i(f) {
for (; ; ) {
let u = n[f.type].always;
if (u === void 0 || (g(u) && (u = u(f)), u === void 0)) break;
f = u;
}
return f;
}
return function(f) {
return {
getFinal: (u) => {
const s = n[u.type];
if (!s.always && !s.wildcard && Q(s.events))
return u;
},
init: () => i(F(r(f))),
reducer: (u, s, ...o) => {
var p;
const a = F(u), h = n[s.type];
let d = (p = h == null ? void 0 : h.events) == null ? void 0 : p[a.type];
if (g(d) ? d = d(a, s, ...o) : d === void 0 && (d = h == null ? void 0 : h.wildcard, g(d) && (d = d(a, s, ...o))), d !== void 0)
return i(F(d));
},
transform: (u, ...s) => {
const o = n[u.type].derive, a = o ? q(u, o, ...s) : u;
return t ? q(a, t, ...s) : a;
},
visit: (u, s, o, ...a) => s(o, u, o.type, ...a)
};
};
};
}
function q(t, e, ...n) {
const r = g(e) ? e(t, ...n) : e;
return { ...t, ...r };
}
function $(t, e, n) {
let r = !1;
const i = t.reducer(n, e, () => {
r = !0;
});
return !r && i === void 0;
}
function x(t, e, n) {
const r = t.reducer(n, e, () => {
});
return r === void 0 ? e : t.transform(r);
}
class A {
constructor(e, n) {
l(this, "effects");
l(this, "onFinal");
l(this, "onMessage");
l(this, "queue", []);
l(this, "final");
l(this, "state");
this.machine = e, this.onMessage = n != null && n.onMessage ? Y(n.onMessage) : () => {
}, this.onFinal = n == null ? void 0 : n.onFinal, this.state = e.transform(e.init()), this.final = e.getFinal(this.state), n != null && n.events && (this.effects = new X(n.events), this.effects.update(this.visit.bind(this), this.send.bind(this)));
}
onChange() {
if (!this.effects) return;
const e = this.queue.length === 0;
if (this.effects.update(this.visit.bind(this), this.send.bind(this)), !!e)
for (; ; ) {
const n = this.queue.shift();
if (n === void 0) break;
this.send(n);
}
}
flush() {
var e;
(e = this.effects) == null || e.flush();
}
isDisabled(e) {
return $(this.machine, this.state, e);
}
next(e) {
return x(this.machine, this.state, e);
}
send(e) {
const n = this.machine.reducer(e, this.state, this.onMessage);
n !== void 0 && (this.state = this.machine.transform(n), this.final = this.machine.getFinal(this.state), this.onChange(), this.onFinal && this.final !== void 0 && this.onFinal(this.final));
}
visit(e, n) {
return this.machine.visit(n, e, this.state);
}
}
function ye(t, e) {
return new A(t, e);
}
function we(t, e) {
return new Promise((n) => {
new A(t, { events: e, onFinal: n });
});
}
function Ce() {
return ee();
}
function ee() {
return function({
events: t,
init: e,
transform: n
}, r) {
return (i) => ({
getFinal: r ?? (() => {
}),
init: () => V(e)(i),
reducer: (f, u, ...s) => {
const o = F(f);
if ((r == null ? void 0 : r(u)) !== void 0) return;
let a = t[o == null ? void 0 : o.type];
if (a !== void 0)
return g(a) && (a = a(o, u, ...s)), a;
},
transform: n ?? c,
visit: (f, u, s, ...o) => u(s, f, "", ...o)
});
};
}
const te = (t) => {
let e = 0;
return function() {
if (e !== t.length)
return { index: e, part: t[e++] };
};
};
function ne() {
return {
foldFn: (t, e) => (e.push(t), e),
init: () => []
};
}
function re(t) {
return {
foldFn: (e, n, { close: r }) => (r(), e),
init: t
};
}
const ie = { close: N };
function _(t, e, n, r, i) {
const f = r(n);
let u = !0;
const s = {
close: () => {
i(), u = !1;
},
index: void 0,
whole: n
};
for (; u; ) {
const o = f();
if (o === void 0) break;
s.index = o.index, t = e(o.part, t, s);
}
return t;
}
const ue = Symbol("REMOVE");
function fe(t) {
return t === ue;
}
function y(t, e) {
throw new Error("forbidden");
}
class b {
constructor(e) {
l(this, "com");
l(this, "getter");
l(this, "isCommand");
l(this, "isFailure");
l(this, "mapper");
l(this, "refold");
l(this, "setter");
this.com = e.com, this.getter = e.getter, this.isCommand = e.isCommand, this.isFailure = e.isFailure, this.mapper = e.mapper, this.refold = e.refold, this.setter = e.setter;
}
static eq() {
return new b({
com: c,
getter: c,
isCommand: m,
isFailure: m,
mapper: k,
refold: c,
setter: c
});
}
command(e, n) {
return this.com(e, n);
}
fold(e, n) {
return this.refold(e.foldFn)(n, S(e.init), ie);
}
modify(e, n) {
return this.mapper(e, n);
}
put(e, n) {
return this.setter ? this.setter(e, n) : this.mapper(() => e, n);
}
update(e) {
return this.isCommand(e) ? (n) => this.com(e, n) : g(e) ? (n) => this.modify(e, n) : (n) => this.put(e, n);
}
view(e, n) {
const r = this.getter ? this.getter(e) : this.fold(re(void 0), e);
return this.isFailure(r) ? g(n) ? n(r) : n : r;
}
}
function Me() {
return function(t) {
return t(b.eq());
};
}
function D(t, e, n) {
if (!(!e || !n))
return t === m ? E(e, n) : function(r) {
const i = e(r);
return t(i) ? i : n(i);
};
}
function H(t, e) {
if (t === m) return e;
if (e === m || t === e) return t;
throw new Error("unexpected failure value");
}
function L(t, e) {
return t === k ? e : (n, r) => t((i) => e(n, i), r);
}
function C(t, e) {
return t === c && e === c ? c : t === c ? (n, r) => n(e(r)) : e === c ? (n, r) => t(n(r), r) : (n, r) => t(n(e(r)), r);
}
function se(t, e, n, r) {
if (!t || !e || !r) return;
const i = e === c ? (f, u) => r(f, u) : (f, u, s) => e(r(f, u), s);
return (f, u) => {
const s = t(u);
return n(s) ? u : i(f, s, u);
};
}
function oe(t, e, n) {
if (!t || !e || !n) return;
const r = e === c ? (i) => n(i) : (i, f) => e(n(i), f);
return (i, f) => r(i, f);
}
function P(t) {
return function(e) {
return new b({
com: (n, r) => e.mapper((i) => t.command(n, i), r),
getter: D(e.isFailure, e.getter, t.getter),
isCommand: t.isCommand,
isFailure: H(e.isFailure, t.isFailure),
mapper: L(
e.mapper,
t.mapper ?? ((n, r) => {
const i = t.getter(r);
return t.isFailure(i) ? r : t.setter(n(i));
})
),
refold: E(
t.refold ?? ((n) => (r, i, f) => {
const u = t.getter(r);
return t.isFailure(u) ? i : n(u, i, f);
}),
e.refold
),
setter: oe(e.getter, e.setter, t.setter)
});
};
}
function M(t) {
return function(e) {
return new b({
com: (n, r) => e.mapper((i) => t.command(n, i), r),
getter: D(e.isFailure, e.getter, t.getter),
isCommand: t.isCommand,
isFailure: H(e.isFailure, t.isFailure),
mapper: L(
e.mapper,
t.mapper ?? ((n, r) => {
const i = t.getter(r);
return t.isFailure(i) ? r : t.setter(n(i), r);
})
),
refold: E(
t.refold ?? ((n) => (r, i, f) => {
const u = t.getter(r);
return t.isFailure(u) ? i : n(u, i, f);
}),
e.refold
),
setter: se(e.getter, e.setter, e.isFailure, t.setter)
});
};
}
function R({
getter: t,
mapper: e,
setter: n
}) {
return P({
command: y,
getter: t,
isCommand: m,
isFailure: m,
mapper: e ?? C(n, t),
refold: t === c ? c : (r) => (i, f, u) => r(t(i), f, u),
setter: n
});
}
function O({
getter: t,
mapper: e,
setter: n
}) {
return M({
command: y,
getter: t,
isCommand: m,
isFailure: m,
mapper: e ?? C(n, t),
refold: t === c ? c : (r) => (i, f, u) => r(t(i), f, u),
setter: n
});
}
function B({
getter: t,
mapper: e,
setter: n
}) {
return P({
command: y,
getter: t,
isCommand: m,
isFailure: w,
mapper: e,
setter: n
});
}
function ce({
getter: t,
mapper: e,
setter: n
}) {
return M({
command: y,
getter: t,
isCommand: m,
isFailure: w,
mapper: e,
setter: n
});
}
function v({
getter: t,
mapper: e,
remover: n,
setter: r
}) {
return M({
command: (i, f) => n(f),
getter: t,
isCommand: fe,
isFailure: w,
mapper: e,
setter: r
});
}
function ae({
coll: t,
form: e
}) {
return M({
command: y,
isCommand: m,
isFailure: w,
mapper: (n, r) => {
const { foldFn: i, init: f } = e(), u = S(f);
return _(
u,
(s, o, a) => i(n(s), o, a),
r,
t,
N
);
},
refold: (n) => function(r, i, { close: f }) {
return _(i, n, r, t, f);
}
});
}
function Oe(t) {
return function(e) {
const n = (i) => Object.is(e.update(t)(i), i), r = (i, f) => i && !n(f) ? e.update(t)(f) : f;
return new b({
com: c,
getter: n,
isCommand: m,
isFailure: m,
mapper: C(r, n),
refold: (i) => (f, u, s) => i(n(f), u, s),
setter: r
});
};
}
function je(t) {
return function(e) {
if (!(e.getter && e.setter))
throw new Error("valueOr don't work with traversals");
const n = (r) => {
const i = e.getter(r);
return e.isFailure(i) ? S(t) : i;
};
return new b({
com: e.com,
getter: n,
isCommand: e.isCommand,
isFailure: m,
mapper: C(e.setter, n),
refold: (r) => {
const i = e.refold(r);
return (f, u, s) => e.isFailure(e.getter(f)) ? r(n(f), u, s) : i(f, u, s);
},
setter: e.setter
});
};
}
function Ee(t) {
return ce({
getter: t,
setter: y
});
}
function Se(t) {
return R({
getter: t,
setter: c
// optics-ts setter is equivalent to: `setter: (_v, a) => a`
});
}
function de(t) {
return O({
getter: c,
setter: t
});
}
function qe(t = Object.is) {
return de((e, n) => t(e, n) ? n : e);
}
function _e(t, e = 0) {
return R({
getter: (n) => t * n + e,
setter: (n) => (n - e) / t
});
}
function Ie(t) {
return O({
getter: (e) => e[t],
setter: (e, n) => I(e, t, n)
});
}
function Ne(t) {
return O({
getter: (e) => e.includes(t),
setter: (e, n) => e ? J(t, n) : K(t, n)
});
}
function ke(t) {
return B({
getter: (e) => t(e) ? e : void 0,
setter: c
});
}
function Ve() {
return B({
getter: (t) => {
const e = parseInt(t);
if (!isNaN(e))
return e;
},
setter: (t) => String(t)
});
}
function Ae(t) {
return v({
getter: (e) => e[t],
remover: (e) => {
if (!(t in e)) return e;
const n = { ...e };
return delete n[t], n;
},
setter: (e, n) => Object.is(n[t], e) && t in n ? n : { ...n, [t]: e }
});
}
function De(t) {
return v({
getter: (e) => e.at(t),
remover: (e) => G(t, e),
setter: (e, n) => I(e, t, n)
});
}
function He(t) {
return v({
getter: (e) => e.find(t),
mapper: (e, n) => {
const r = n.findIndex(t);
if (r < 0) return n;
const i = e(n[r]);
return [...n.slice(0, r), i, ...n.slice(r + 1)];
},
remover: (e) => {
const n = e.findIndex(t);
return n < 0 ? e : [...e.slice(0, n), ...e.slice(n + 1)];
},
setter: (e, n) => {
const r = n.findIndex(t);
return r < 0 ? j(e, n) : [...n.slice(0, r), e, ...n.slice(r + 1)];
}
});
}
function Le(t) {
return O({
getter: (e) => e.filter(t),
setter: (e, n) => {
let r = !1;
const i = [];
let f = 0, u = 0, s = 0;
for (f = 0; f < n.length; f++) {
const o = n[f];
t(o) ? u < e.length ? (r = r || !Object.is(e[u], o), i[s] = e[u], u++, s++) : r = !0 : (i[s] = o, s++);
}
for (; u < e.length; u++, s++)
r = !0, i[s] = e[u];
return r ? i : n;
}
// if needed, implementing a custom mapper could improve speed
});
}
function Pe() {
return v({
getter: (t) => t.length ? t.slice(1) : void 0,
remover: (t) => t.length ? t.slice(0, 1) : t,
setter: (t, e) => e.length ? [e[0], ...t] : e
});
}
function Re() {
return v({
getter: (t) => t.at(0),
remover: (t) => t.length ? t.slice(1) : t,
setter: z
});
}
function Be() {
return v({
getter: (t) => t.at(-1),
remover: (t) => t.length ? t.slice(0, -1) : t,
setter: j
});
}
function Te() {
return v({
getter: (t) => t.at(0),
remover: (t) => t.length ? t.slice(1) : t,
setter: j
});
}
function Ue() {
return ae({
coll: te,
form: ne
});
}
export {
b as COptic,
X as MachineEffects,
ue as REMOVE,
j as append,
k as apply,
De as at,
ie as ctxNull,
Fe as curry,
ge as curry1,
qe as dedupe,
Oe as disabled,
Ue as elems,
Le as findMany,
He as findOne,
pe as flow,
Me as focus,
y as forbidden,
te as fromArray,
S as fromInit,
F as fromSendable,
Re as head,
c as id,
Ne as includes,
he as insert,
J as insertValue,
$ as isDisabled,
Q as isEmpty,
g as isFunction,
m as isNever,
w as isUndefined,
R as iso,
O as lens,
_e as linear,
Z as multiStateBaseMachine,
ve as multiStateMachine,
x as nextState,
N as noop,
Ie as nth,
ye as objectMachine,
M as opticNonPrism,
P as opticPrism,
ce as optional,
be as pipe,
E as pipe2,
z as prepend,
B as prism,
we as promiseMachine,
Ae as prop,
Te as queue,
v as removable,
G as remove,
K as removeValue,
I as replace,
Se as reread,
de as rewrite,
W as shallowEqual,
ee as simpleStateBaseMachine,
Ce as simpleStateMachine,
Be as stack,
Ve as strToNum,
Pe as tail,
Ee as to,
ne as toArray,
re as toFirst,
V as toInit,
Y as toListener,
ae as traversal,
je as valueOr,
ke as when,
me as withSend
};
//# sourceMappingURL=index.js.map