Common Functional Programming Algebraic data types for JavaScript that is compatible with most modern browsers and Deno.
This example uses the Ramda library - for simplification - but you should be able to use any library that implements the Fantasy-land specifications.
import { compose, converge, lift, map, prop } from "https://x.nest.land/ramda@0.27.0/source/index.js";
import Either from "https://deno.land/x/functional@v0.5.0/Either.js";
import Task from "https://deno.land/x/functional@v0.5.0/Task.js";
const fetchUser = userID => Task.wrap(_ => fetch(`${URL}/users/${userID}`).then(response => response.json()));
const sayHello = compose(
converge(
lift((username, email) => `Hello ${username} (${email})!`),
[
map(prop("username")),
map(prop("email"))
]
),
fetchUser
);
// Calling `sayHello` results in an instance of `Task` keeping the function pure.
assert(Task.is(sayHello(userID)));
// Finally, calling `Task#run` will call `fetch` and return a promise
sayHello(userID).run()
.then(container => {
// The returned value should be an instance of `Either.Right` or `Either.Left`
assert(Either.Right.is(container));
// Forcing to coerce the container to string will show that the final value is our message.
assert(container.toString(), `Either.Right("Hello johndoe (johndoe@gmail.com)!")`);
});
// await sayHello(userID).run() === Either.Right(String)