conductor is a modern utility library to help you control the execution flow using functional programming.
It provides a set of utility functions which can be used both with asynchronous and synchronous code, allowing you to control your execution flow very clearly and with a minimum of code. The library is designed in a functional programming spirit, to provide a coherent API and highly composable functions. Think of it as if Ramda & Async had a baby.
Read more on Why I'm building conductor.
npm install conductor
Here are a few examples of what you can do with conductor.
import { map } from 'conductor'
const fetchCharacter = id => fetch(`https://swapi.co/api/people/${id}`).then(res => res.json())
const character_ids = [1, 2, 3]
await map(fetchCharacter, character_ids) // [{id: 1, name: 'Luke'}, ...]
You can use map
with an asynchronous mapper and directly use the await
keyword. No need to use Promise.all
like you need to with Array.prototype.map
or lodash.map
.
import { compose, get } from 'conductor'
const character_id = 1
const fetchCharacter = id => fetch(`https://swapi.co/api/people/${id}`).then(res => res.json())
const fetchPlanet = url => fetch(url).then(res => res.json())
const getHomeworldName = compose(get('name'), fetchPlanet, get('homeworld'), fetchCharacter)
await getHomeworldName(character_id) // Tatooine
You can compose functions seamlessly, without ever wondering if you need to use Promise.prototype.then
because one function returns a Promise
. Simply add await
before compose if one your functions is asynchronous.
import { compose, equals, get, join, map, filter } from 'conductor'
const jedis = [
{ name: 'Luke', side: 'light' },
{ name: 'Yoda', side: 'light' },
{ name: 'Darth Vader', side: 'dark' },
]
const isGood = filter(compose(equals('light'), get('side')))
const getName = map(get('name'))
const concat = join(', ')
compose(concat, getName, isGood)(jedis) // 'Luke, Yoda'
All functions in conductor are curried by default, which means they can be used in a partially applied form to define very modular and composable blocks in your code. In the example above, we have an array of jedis
, and we want to retrieve a concatenated string of all the good guys' name. We first define an isGood
function, which will filter out the bad guys. Then, we create a mapping functiongetName
which will retrieve each jedi's name. Finally, we create a concatenating function called concat
. We can now easily compose them and pass thejedis
array to the resulting function. Notice how we created small & modular point-free functions, and only passed the input data when we actually needed to.