Monads- Maybe.exmaples.Async.js

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

by dimitrs_papadimitriou

HTML

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

JavaScript

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

  var fetchClientsMock = () => new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(
        [{ id: 1, name: 'Joan', age: 29, employeeId: 1 },
        { id: 2, name: 'Rick', age: 25, employeeId: 2 }])
    }, 1000);
  })

  var fetchEmployeesMock = () => new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(
        [{ id: 1, name: 'jim', age: 29 },
        { id: 2, name: 'jane', age: 25 }])
    }, 1000);
  })
  const some = v => ({
    map: f => some(f(v)),
    bind: f => f(v),
    cata: alg => alg.some(v)
  });

  const none = () => ({
    map: () => none(),
    bind: () => none(),
    cata: alg => alg.none()
  });

  Array.prototype.safeHead = function () {
    return this.length > 0 ?
      some(this[0]) :
      none()
  }

  var clientRepository = ({
    getById: (id) =>
      fetchClientsMock()
        .map(clients => clients.filter(c => c.id == id)
          .safeHead())

  });

  var employeeRepository = ({
    getById: (id) =>
      fetchEmployeesMock()
        .map(clients => clients.filter(c => c.id == id)
          .safeHead())
  });

  var displayAssignedEmployeeForClientId = (clientId) =>
    clientRepository
      .getById(clientId)
      .then(client => client.bind(c => employeeRepository.getById(c.employeeId))
          .map(e => e.name)
          .cata({
            some: name => console.log("assigned Employee name: " + name),
            none: _ => console.log("client is not assigned ")
          }));


  displayAssignedEmployeeForClientId(1)