Database failover modelled with the `alt` typeclass.
const Task = require('data.task') | |
Task.prototype.alt = function (that) { | |
return new Task((rej, res) => | |
this.fork(_ => that.fork(rej, res), res)) | |
} | |
const hosts = [ | |
[ 'db1.mysite.com', 'user', 'password' ], | |
[ 'db2.mysite.com', 'user', 'password' ], | |
[ 'db3.mysite.com', 'user', 'password' ] | |
] | |
const connect = config => new Task((rej, res) => | |
doSomeConnection(config).then(res).else(rej)) | |
// The first available DB or an error! | |
// db :: Task String DB | |
const db = hosts.reduceRight( | |
(acc, host) => connect(host).alt(acc), | |
new Task((rej, res) => rej('No DBs available!'))) |
This comment has been minimized.
This comment has been minimized.
Aha, a sneaky semigroup! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Interestingly, you can wrap any Alternative in
Alt
to make it a monoid:Then you can
foldMap
instead of manually reducing