Monads- Maybe.exmaples.js

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

by dimitrs_papadimitriou

HTML

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

JavaScript

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) =>
      [{ id: 1, name: 'Joan', age: 29, employeeId: 1 },
      { id: 2, name: 'Rick', age: 25, employeeId: 2 }]
        .filter(c => c.id == id)
        .safeHead()
  });

  var employeeRepository = ({
    getById: (id) =>
      [{ id: 1, name: 'jim', age: 29 },
      { id: 2, name: 'jane', age: 25 }]
        .filter(employee => employee.id == id)
        .safeHead()
  });

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