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)
});