JSFiddle - React, Tailwind, and code Playground
by dimitrs_papadimitriou
JavaScript
(function() {
const ok = v => ({
map: f => ok(f(v)),
bind: f => f(v),
cata: alg => alg.ok(v)
});
const error = v => ({
map: () => error(v),
bind: () => error(v),
cata: alg => alg.error(v)
});
var safeTry = f => {
try {
return ok(f());
} catch (e) {
return error(e);
}
};
var reader = view => ({
run: c => view(c),
safeRun: safeTry(() => view(c))
});
const compose = (...fns) => x => fns.reduceRight((y, f) => f(y), x);
const id = x => x;
const idM = x => ok(x);
const EitherAsync = (actions, mappings) => ({
map: f =>
EitherAsync(actions, {
resolve: compose(
f,
mappings.resolve
),
reject: mappings.reject
}),
mapError: f =>
EitherAsync(actions, {
resolve: mappings.resolve,
reject: compose(
f,
mappings.reject
)
}),
bimap: (f, g) =>
EitherAsync(actions, {
resolve: compose(
f,
mappings.resolve
),
reject: compose(
g,
mappings.reject
)
}),
ap: fv =>
EitherAsync(
(resolve, reject) =>
actions(
f =>
fv
.map(
compose(
f,
mappings.reject
)
)
.cata({
ok: resolve,
error: reject
}),
reject
),
mappings
),
bind: f =>
EitherAsync(
(resolve, reject) =>
actions(
x =>
f(mappings.resolve(x)).cata({
ok: resolve,
error: reject
}),
reject
),
mappings
),
cata: alg =>
actions(
compose(
alg.ok,
mappings.resolve
),
compose(
alg.error,
...