pipe-es
v0.1.0
Published
Visually appealing pipe operator for TypeScript
Downloads
87
Maintainers
Readme
Visually appealing pipe operator in TypeScript:
import pipe from 'pipe-es';
import * as R from "remeda";
pipe("Hello world!")
.ᐅ(R.toUpperCase())
.ᐅ(R.split(""))
.ᐅ(R.reverse())
.ᐅ(R.join(""))
.ᐅ(console.log);With IDE autocompletion, the emoji method name (ᐅ) is not an issue.
Installation
npm i pipe-es or copy the source code to your repository:
export default function pipe<T>(value: T) {
type AsyncAwareReturn<V> = ReturnType<
typeof pipe<T extends Promise<unknown> ? Promise<V> : V>
>;
interface PipeFn<T> {
<V>(fn: (value: Awaited<T>) => V): AsyncAwareReturn<V>;
<V, P2>(
fn: (value: Awaited<T>, arg: P2) => V,
arg: P2,
): AsyncAwareReturn<V>;
(): T;
}
return {
/**
* Pipe to a function provided as a first argument.
* Call with no arguments to return the current value.
*/
ᐅ: ((fn?: (x: T, ...args: unknown[]) => unknown, ...args: unknown[]) => {
if (!fn) return value;
const newValue =
value instanceof Promise
? value.then((result: Awaited<T>) => fn(result, ...args))
: fn(value, ...args);
return pipe(newValue);
}) as PipeFn<T>,
};
}API
To start a pipe call the pipe(initial_value) function with the initial value. Then call the ᐅ method that comes in three flavours:
If no parameters are provided, the method returns the current value:
import pipe from 'pipe-es'; import * as R from "remeda"; const result = pipe("Hello world!") .ᐅ(R.toUpperCase()) .ᐅ(); console.log(result === "HELLO WORLD!"); // prints 'true'Provide a transformer function to pipe current value through it:
import pipe from 'pipe-es'; import * as R from "remeda"; const result = pipe("Hello world!") .ᐅ(R.toUpperCase()) .ᐅ(R.split(""))Optionally, provide 2nd parameter that will be passed to the transformer function.
import pipe from 'pipe-es'; // The two examples below are equivalent pipe("Hello world!") .ᐅ(log, "input"); pipe("Hello world!") .ᐅ((value) => log(value, "input")); function log<V>(value: V, label?: string): V { const reset = "\x1b[0m"; const green = "\x1b[32m"; const labelArray: unknown[] = label ? [`${green}[${label}]${reset}`] : []; console.log(...labelArray.concat(value)); return value; }
License
MIT
