Promise Composition

https://github.com/eu81273/jsfiddle-console

by dimitrs_papadimitriou

HTML

<script src="https://rawgit.com/eu81273/jsfiddle-console/master/console.js"></script>
<script src="https://code.jquery.com/jquery-3.4.0.js"></script>

JavaScript

Promise.prototype.bind = function(func) {
    var initialPromise = this;
    return new Promise(function(resolve) {
      initialPromise.then(result => func(result).then(x => resolve(x)))
    });
  };

  Promise.prototype.map = function(mapping) {
    var initialPromise = this;
    return new Promise(function(resolve) {
      initialPromise.then(result => resolve(mapping(result)))
    });
  }

 

  var EitherAsync = (actions, g) => ({

    map: f => EitherAsync(actions, x => f(g(x))),

    bind: f => EitherAsync((resolve, reject) => {
      actions( x => f(g(x)) .cata({
        ok: resolve,
        error: reject
      }), reject)
    }, x => x),


    cata: alg => actions(x => alg.ok(g(x)), alg.error),
  })

  Promise.prototype.toEither = function() {
    var initialPromise = this;
    var either = EitherAsync(function(resolve, reject) {
      initialPromise.then(resolve).catch(reject)
    }, x => x);
    return either;
  }

  var getUser = () => fetch("https://api.github.com/users");

  var getUserFollowers = (name) => fetch("https://api.github.com/users/" + name + "/followers");

  var toJson = response => response.json()

  getUser()
    .map(toJson)
    .toEither()
    .map(users => users[0].login)
    //.bind((v) => getUserFollowers(v).map(toJson).toEither())
  //  .map(followers => followers.map(follower => follower.login))
    .cata({
      ok: v => console.log(v),
      error: v => console.log("Error :" + v)
    });