Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/phenax/pipey
Create pipeline operator ready functions by converting instance methods's to context-free functions
https://github.com/phenax/pipey
currying functional-programming javascript pipe-operator prototype
Last synced: about 2 hours ago
JSON representation
Create pipeline operator ready functions by converting instance methods's to context-free functions
- Host: GitHub
- URL: https://github.com/phenax/pipey
- Owner: phenax
- License: mit
- Created: 2018-10-21T14:00:59.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2022-12-08T19:14:39.000Z (almost 2 years ago)
- Last Synced: 2024-11-09T02:08:10.866Z (7 days ago)
- Topics: currying, functional-programming, javascript, pipe-operator, prototype
- Language: JavaScript
- Homepage:
- Size: 499 KB
- Stars: 24
- Watchers: 3
- Forks: 2
- Open Issues: 17
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# Pipey
Utility functions to convert instance methods's to context-free functions ready for use with [esnext pipeline operator](https://github.com/tc39/proposal-pipeline-operator) and point-free functional programming. Convert any `x.whatever(...args)` to `whatever(...arg)(x)`.[![CircleCI](https://img.shields.io/circleci/project/github/phenax/pipey/master.svg?style=for-the-badge)](https://circleci.com/gh/phenax/pipey)
[![npm bundle size (minified + gzip)](https://img.shields.io/bundlephobia/minzip/pipey.svg?style=for-the-badge)](https://www.npmjs.com/package/pipey)
[![Codecov](https://img.shields.io/codecov/c/github/phenax/pipey.svg?style=for-the-badge)](https://codecov.io/gh/phenax/pipey)[Read the documentation for more information](https://github.com/phenax/pipey/tree/master/docs)
### Install it
```bash
yarn add pipey
```### Import it to your file
```js
import { createPipe, createPipes, fromClassPrototype, compose } from 'pipey';
// Note: compose is a regular lodash-like compose functionimport _ from 'pipey/proxy'; // For proxy-based api
```### fromClassPrototype
```js
const { map, filter } = fromClassPrototype(Array);const doubleNumbers = map(x => x * 2);
const doubleOddNumbers = compose(doubleNumbers, filter(x => x % 2));doubleOddNumbers([ 2, 3, 4, 5 ]); // Returns [ 6, 10 ]
```### createPipe
```js
const forEach = createPipe('forEach');
forEach(x => console.log(x))([ 1, 2, 3, 4 ]); // Logs 1 2 3 4
```### createPipes
```js
const { map, filter, split } = createPipes(['map', 'filter', 'split']);
const head = ([ first ]) => first;
const compact = filter(Boolean);const getFirstNames = names =>
names
|> compact
|> map(split(' '))
|> map(head);getFirstNames([ '', null, 'Akshay Nair', 'John Doe', 'Bruce Fucking Lee' ]); // Returns ['Akshay', 'John', 'Bruce']
```### Proxy based api
A proxy based alternative api for pipey
[Read the documentation](https://github.com/phenax/pipey/tree/master/docs/proxy.md)```js
import _ from 'pipey/proxy';const getInitials = compose(
_.join(''),
_.map(_.charAt(0)),
_.split(' '),
_.$prop('name'), // $prop is a pre-defined plugin
);getInitials({ name: 'Akshay Nair' }) === 'AN';
```### Example use cases
* Using with the amazing pipe operator
```js
const { map, filter, reduce } = fromClassPrototype(Array);const getInputData = () =>
document.querySelectorAll('.js-input')
|> map($input => [ $input.name, $input.value ])
|> filter(([_, value]) => value)
|> Object.fromEntries
|> Array.from;getInputData(); // Returns something like { email: '[email protected]', name: 'Han Solo' }
```* Working with collection methods
```js
// Two ways to extract methods out (createPipes & fromClassPrototype)
const { map, filter } = fromClassPrototype(Array);
const { split } = createPipes(['split']);const getFirstNames = compose(
map(xs => xs[0]),
map(split(' ')),
filter(Boolean),
);getFirstNames([ '', null, 'Akshay Nair', 'John Doe', 'Bruce Fucking Lee' ]); // Returns ['Akshay', 'John', 'Bruce']
```* Working with dom methods
```js
const { forEach, join } = fromClassPrototype(Array);
const { setAttribute } = fromClassPrototype(HTMLInputElement);
const inputs = ['.js-input-name', '.js-input-email'];inputs
|> join(', ')
|> (selector => document.querySelectorAll(selector))
|> forEach(setAttribute('disabled', 'disabled'));
```