prollable
Promises are great since they encourage error handling and compose easily. Why not use them as wrappers for synchronous code too? prollable
exposes some convenient functions for composing nullables and conditions using Promises.
Promise<¯\_(ツ)_/¯>
Example
Intro
Let's say we are building passwordless authentication. The user writes their email address in a form field and if the address is known, they get a JWT sent to their inbox.
In our application we got a function, signJwt
, that takes an Email and returns a Promise of a JWT:
// Email → Promise<JWT> { ... }
We also got an array of known emails:
const emails = 'foo@example.com' 'bar@example.com'
Now we are gonna create a function, authorize
, that takes a Request, extracts the Email from the Request body, validates the Email, and uses signJwt
to sign the JWT.
// Request → Promise<JWT> { ... }
Before
A traditional approach could look something like this:
// Request → Promise<JWT> { if !reqbodyemail return Promise if !emails return Promise return }
After
Using prollable
we can easily convert the nullables and conditions to Promises and let the data flow through a chain instead:
const fromCondition fromNullable = // Request → Promise<JWT> { return }
You can even go one step further and abstract each Promise to its own function to allow a more point-free style:
// Request → Promise<Email>const getEmail = // Email → Promise<Email>const validateEmail = // Request → Promise<JWT>const authorize =
It's important to note that prollable
is just as much about the idea of using Promises more extensively for (propagated) error handling. It's completely possible to reach the same chainable result using the Promise constructor inside the onFulfilled
callback of .then
:
// Request → Promise<JWT> { return regbodyemail ? : }
API
prollable.fromCondition(..)
-
Arguments:
condition
resolveTo
rejectTo
-
Returns: Promise
-
Example:
const persons =age: '30' name: 'Bob'name: 'Alice'const bobPromises = persons
prollable.fromNullable(..)
-
Arguments:
nullable
rejectTo
-
Returns: Promise
-
Example:
const persons =age: '30' name: 'Bob'name: 'Alice'const agePromises = persons