Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dword-design/fp.macro

A zero-runtime functional programming babel macro.
https://github.com/dword-design/fp.macro

array build-time collection curry currying filter flatmap flatten fp functional-programming join lodash map mapvalues object ramda reduce sort values zero-runtime-overhead

Last synced: 20 days ago
JSON representation

A zero-runtime functional programming babel macro.

Awesome Lists containing this project

README

        

# fp.macro



npm version
Linux macOS Windows compatible
Build status

Coverage status

Dependency status
Renovate enabled

Open in Gitpod

Buy Me a Coffee

PayPal

Patreon

A zero-runtime functional programming babel macro.

`fp.macro` This is a build-time functional programming library that allows you to use high-level collection functions without a production dependency and without the runtime penalty that you have when using a dedicated library.

It does so by exposing a [Babel](https://babeljs.io/) macro that is evaluated at build time by [babel-plugin-macros](https://github.com/kentcdodds/babel-plugin-macros). So in the end you do not have a production dependency anymore, it's all in the generated Babel code.

## Install

```bash
# npm
$ npm install fp.macro

# Yarn
$ yarn add fp.macro
```

## Usage

Install `babel-plugin-macros`:

```bash
$ npm install babel-plugin-macros
```

The plugin is best used with the [Babel pipeline operator](https://babel.dev/docs/en/babel-plugin-proposal-pipeline-operator), so optionally install this one as well:

```bash
$ npm install @babel/plugin-proposal-pipeline-operator
```

Then add the plugins to your babel config or create a `.babelrc.json` file:

```json
{
"plugins": [
"babel-plugin-macros",
["@babel/plugin-proposal-pipeline-operator", { "proposal": "fsharp" }]
]
}
```

Create a JavaScript file and start mapping collections:

```js
import { filter, join, map, mapValues } from 'fp.macro'

const myMap = map(x => x * 2)

console.log(myMap([1, 2]))
// [2, 4]

// Using pipeline operator
console.log(
[1, 2, 3]
|> map(x => x * 2)
|> filter(x => x > 2)
|> join(',')
)
// 4,6

console.log(
{ foo: { name: 'foo' }, bar: { name: 'bar' } }
|> mapValues(x => x.name)
)
// { foo: 'foo', bar: 'bar' }
```

To run the files, you need to use Babel. You can either compile them using [@babel/cli](https://babel.dev/docs/en/babel-cli), or run them directly via [@babel/node](https://babel.dev/docs/en/babel-node) (which is not recommended for production though).

The library is currently in development, so for more insights into the available functions check out the source code.

## Contribute

Are you missing something or want to contribute? Feel free to file an [issue](https://github.com/dword-design/fp.macro/issues) or a [pull request](https://github.com/dword-design/fp.macro/pulls)! ⚙️

## Support

Hey, I am Sebastian Landwehr, a freelance web developer, and I love developing web apps and open source packages. If you want to support me so that I can keep packages up to date and build more helpful tools, you can donate here:



Buy Me a Coffee
 If you want to send me a one time donation. The coffee is pretty good 😊.


PayPal
 Also for one time donations if you like PayPal.


Patreon
 Here you can support me regularly, which is great so I can steadily work on projects.

Thanks a lot for your support! ❤️

## License

[MIT License](https://opensource.org/licenses/MIT) © [Sebastian Landwehr](https://sebastianlandwehr.com)