Awesome
Fluture Hooks
Fantasy Land Monad and Alternative instances for return values from
Fluture's hook
.
Usage
Node
$ 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.
Deno and Modern Browsers
You can load the EcmaScript module from various content delivery networks:
Old Browsers and Code Pens
There's a UMD file included in the NPM package, also available via jsDelivr: https://cdn.jsdelivr.net/npm/fluture-hooks@2.1.3/dist/umd.js
This file adds flutureHooks
to the global scope, or use CommonJS/AMD
when available.
Usage Example
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 */
})));
API
<a name="Hook" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L104">Hook :: ((b -> a) -> a) -> Hook a b
</a>
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));
<a name="hook" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L138">hook :: Future a b -> (b -> Future c d) -> Hook (Future a e) b
</a>
hook (m) (f)
is the equivalent of Hook (Future.hook (m) (f))
.
<a name="acquire" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L143">acquire :: Future a b -> Hook (Future a d) b
</a>
Creates a Hook without the need for a disposal function.
<a name="runHook" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L148">runHook :: Hook b a -> (a -> b) -> b
</a>
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
.
<a name="ParallelHook" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L158">ParallelHook :: Hook a b -> ParallelHook a b
</a>
Construct a ParallelHook using a Hook.
ParallelHook a
has a Functor instance, and ParallelHook (Future a b)
has an Applicative instance with parallel behaviour.
<a name="sequential" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L256">sequential :: ParallelHook a b -> Hook a b
</a>
Converts a ParallelHook to a normal Hook.
<a name="hookAll" href="https://github.com/fluture-js/fluture-hooks/blob/v2.1.3/index.js#L263">hookAll :: Array (Hook (Future a b) c) -> Hook (Future a b) (Array c)
</a>
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)
.