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,
         ...