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)