Module
x/functional/.github/README.md
Common Functional Programming Algebraic data types for JavaScript that is compatible with most modern browsers and Deno.
Functional
Common Functional Programming Algebraic data types for JavaScript that is compatible with most modern browsers and Deno.
Usage
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)