Skip to content

Instantly share code, notes, and snippets.

@danny-andrews
Created October 25, 2017 02:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danny-andrews/e919b523ed8522fffcc86cbe7776583f to your computer and use it in GitHub Desktop.
Save danny-andrews/e919b523ed8522fffcc86cbe7776583f to your computer and use it in GitHub Desktop.
const Future = require('fluture');
const R = require('ramda');
const {Reader} = require('monet');
const FakeDb = () => {
const data = {
1: {id: 1, name: 'bob', bff: 2},
2: {id: 2, name: 'alice', bff: 1}
};
return { byId: id => Promise.resolve(data[id]) };
};
const upperName = data => data.name.toUpperCase();
const getUser1 = Reader(db => db.byId(1));
const getBestFriend = data => Reader(db => db.byId(data.bff));
const ReaderPromise = value => {
const map = fn => ReaderPromise(
value.map(
promise => promise.then(fn)
)
);
const chain = fn => ReaderPromise(
value.chain(
promise => Reader(
config => promise.then(
(...args) => fn(...args).run(config)
)
)
)
);
return Object.freeze({chain, map, run: (config) => value.run(config)});
}
const program = ReaderPromise(getUser1)
.chain(data => ReaderPromise(getBestFriend(data)))
.map(upperName)
program.run(FakeDb()).then(console.log);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment