class Reader {
constructor(f) {
this.f = f
}
run(e) {
return this.f(e)
}
fmap(g) {
return new Reader(e => this.run(e).then(g))
}
bind(g) {
return new Reader(e => this.run(e).then(x => g(x).run(e)))
}
}
const returnR = a => new Reader(_ => Promise.resolve(a))
const ask = new Reader(x => Promise.resolve(x))
const comp3 = v =>
ask.bind(({myNum}) =>
returnR(myNum * v))
const comp2 = _ =>
ask.bind(({myNum}) =>
returnR(myNum * 3)
)
comp2().bind(comp3).fmap(x => x * 100).run({myNum: 5}).then(x => console.log(x))