Fantasy Land Monad and Alternative instances for return values from
Fluture's hook
.
$ npm install --save fluture-hooks
On Node 12 and up, this module can be loaded directly with import
or
require
. On Node versions below 12, require
or the esm-loader can
be used.
You can load the EcmaScript module from various content delivery networks:
There's a UMD file included in the NPM package, also available via jsDelivr: https://cdn.jsdelivr.net/npm/[email protected]/dist/umd.js
This file adds flutureHooks
to the global scope, or use CommonJS/AMD
when available.
import {Future, node, fork} from 'fluture/index.js';
import {hook, hookAll, runHook} from 'fluture-hooks/index.js';
const acquirePostgres = (
node (done => require ('imaginary-postgres').connect (done))
);
const acquireRedis = (
node (done => require ('imaginary-redis').connect (done))
);
const closeConnection = connection => (
node (done => connection.end (done))
);
const postgresHook = hook (acquirePostgres) (closeConnection);
const redisHook = hook (acquireRedis) (closeConnection);
const servicesHook = hookAll ([postgresHook, redisHook]);
const withServices = runHook (servicesHook);
fork (console.error)
(console.log)
(withServices (([postgres, redis]) => Future ((rej, res) => {
/* consume postgres and redis */
})));
Tags a function awaiting a callback (such as the value returned by
Fluture's hook
) as a "Hook".
Hook a
has Monad instance with sequential behaviour in its Applicative.
Hook (Future.hook (myResourceAcquisition) (myResourceDisposal));
hook (m) (f)
is the equivalent of Hook (Future.hook (m) (f))
.
Creates a Hook without the need for a disposal function.
Given a Hook and a callback, runs the Hook, returning the callbacks' return value. For Hooks created from Fluture's hook, this means a Future is retured.
This function can also be thought of as "untagging" a Hook
:
runHook (Hook (h)) = h
.
Construct a ParallelHook using a Hook.
ParallelHook a
has a Functor instance, and ParallelHook (Future a b)
has an Applicative instance with parallel behaviour.
Converts a ParallelHook to a normal Hook.
Combines resources from many hooks into a single hook in parallel, given that the eventual consumption of this new hook will return a Future.
hookAll (hooks)
is the equivalent of
sequential (sequence (ParallelHook) (map (ParallelHook) (hooks)))
for all
hooks :: Array (Hook (Future a b) c)
.