Skip to content

ziolko/pipe-es

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:

Source code
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:

  1. 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'
  2. 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(""))
  3. 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

About

Visually appealing pipe for TypeScript

Topics

Resources

License

Stars

Watchers

Forks