Skip to content

Instantly share code, notes, and snippets.

@grushetsky
Forked from sebmarkbage/Infrastructure.js
Last active March 10, 2019 23:59
Show Gist options
  • Save grushetsky/a05204252568e95c69b0df0ee8f45d5f to your computer and use it in GitHub Desktop.
Save grushetsky/a05204252568e95c69b0df0ee8f45d5f to your computer and use it in GitHub Desktop.
Poor man's algebraic effects in JavaScript
let cache = new Map();
let pending = new Map();
function fetchTextSync(url) {
if (cache.has(url)) {
return cache.get(url);
}
if (pending.has(url)) {
throw pending.get(url);
}
let promise = fetch(url).then(
response => response.text()
).then(
text => {
pending.delete(url);
cache.set(url, text);
}
);
pending.set(url, promise);
throw promise;
}
async function runPureTask(task) {
for (;;) {
try {
return task();
} catch (x) {
if (x instanceof Promise) {
await x;
} else {
throw x;
}
}
}
}
function getUserName(id) {
var user = JSON.parse(fetchTextSync('/users/' + id));
return user.name;
}
function getGreeting(name) {
if (name === 'Seb') {
return 'Hey';
}
return fetchTextSync('/greeting');
}
function getMessage() {
let name = getUserName(123);
return getGreeting(name) + ', ' + name + '!';
}
runPureTask(getMessage).then(message => console.log(message));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment