JSFiddle - React, Tailwind, and code Playground

by dimitrs_papadimitriou

JavaScript

var demo = function() {
  (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(
 ...