npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

pipe-me

v1.3.3

Published

Pipeable programming for cleaner code. Uses callbags and pipeline operator.

Downloads

17

Readme

pipe-me

npm Build Status GitHub issues codecov Dependencies Known Vulnerabilities

pipe-me is a clean & functional way to describe interactions in JavaScript.

import { fromEvent, filter, map, merge, sideEffect } from 'pipe-me'

import { getRandomFruit, getCurrentDateTime } from './utils'
import { renderDOM } from './dom'

const buttonClicked = fromEvent(document, 'click')
  |> filter(event => event.target.tagName === 'BUTTON')
  |> map(() => ({ date: getCurrentDateTime(), fruit: getRandomFruit() }))

buttonClicked
  |> sideEffect(renderDOM)

buttonClicked
  |> sideEffect(state => console.log(state))

See Live Demo

Features

  • UNIX(ish) FTW: Describe your entire app as functions over time with streams and pipes.
  • More Design Pattern than Framework — Under the hood, pipe-me merely uses the pipeline operator and callbags. To move off of pipe-me, or to extend it, you can use anything in the callbag universe.
  • Simplified Language Design: This is designed to be a starter kit for callbags, with a focus on naming functions in a way that tries to keep analogies and concepts unified and designed for modeling complex interactions in apps.
  • Elm in JS: By mixing with flow for type annotations, JavaScript is given all the major syntax features elm, allowing you to create beautiful streams of functions based on beautiful data structures.
  • Streams For Interactive Apps: All of pipe-me creators multicast, aka share, by default. This works well for modeling dataflow between interactions.
  • Graphical Code Annotations: Graphic code annotations make understanding different functions a lot easier.

Callbag Features

By using callbags under the hood, we get all the benefits of callbags.

  • Support Reactive & Interactive Programming: Callbags as a spec supports promises/async, iterators/generators, events, & observables to provide a hybrid of reactive and interactive programming.
  • Chain Everything: Working just like Rx.js, var/let/const can be used to create chains of callbags that describe your app clearly. If you are new to JavaScript, this library may sound complicated, but bear with it. Do you know how to use spreadsheets? Well then, you already understand the basics concepts behind this library.
  • Fast: Approximately as fast as xstream and RxJS.
  • Modular: Everything is a utility function based on the callbag spec, so no core library is needed.

Installation

Try Out

Clone this repo. Run yarn or npm install. Then yarn example. Then click the button in the example and watch the DOM and console both print at the same time with such little effort.

Install

Yarn/npm

yarn add pipe-me
npm install pipe-me --save

Babel

To use the pipeline operator, you'll need to add the pipeline-operator plugin to your babel config. We would also recommend installing babel-flow for clean data structures.

Fresh Install

For setting up from scratch, the following should be adequate.

yarn add @babel/cli @babel/preset-env @babel/preset-plugin-proposal-pipeline babel-preset-flow  --dev
{
    "presets": ["@babel/preset-env", "flow"],
    "plugins": ["@babel/plugin-proposal-pipeline-operator"]
}
CLI
yarn run babel src/ -- -d lib/

Main Concepts

If you are new to paradigms like this (found in systems like RxJS and IxJS), sometimes it can be hard to remember the purpose of different operators. To simplify this, you can import from 5 different categories.

  • Create: Create callbags from a number of sources, including Promises, Generators, etc.
  • Side Effects: Only way to have data affect external world, including UI. Only two methods are sideEffect, and log.
  • Transforms: Change the content of your data.
  • Filters: Filter out data based on different criteria. Includes different timer operators, like time based ones like throttle.
  • Combiners: Combine 2 or more callbags into with different techniques.

Language Design

pipe-me is designed with the hope of having a gradual learning curve for beginner js developers with little background in computer science or functional programming, while maximizing use of proper callbags and UNIX-like Principles for professional app development.

Current Problem

The world of Observables, FRP, and related systems have a huge learning curve for many beginner coders.

Part of this may be due to the size of operations and complex amount of analogies used within the world.

  • Water utilities (streams, pipes, backpressure, pool, sources, sinks)
  • Radio systems (subscribe, publish, observable, signals)
  • Grammar (subject, predicate)
  • Paper (foldp, fold)
  • Sensory (observable, observe)
  • Computer hardware related (drivers, ports)
  • Math + Lambda Calculus (map, flatten)
  • And sheer mind games (wtf is a flatmap)

pipe-me API Goals

  • Simple language for basic English speakers and bare bones computer science / js knowledge, focusing on stream and first class event variables.
  • Commit to internally consistent analogy.
  • Maximize pipe syntax to mimic UNIX pipes.
  • Allow for gradual learning of inner workings of callbag spec.

Is This Standard JavaScript?

While pipe-me makes opinions on naming conventions of operators, under the hood is just a mash of two proposal specs, the pipeline operator, and callbags.

In terms of the the pipeline operator, it is currently a TC39 proposal, similar to object spread. So technically it is subject to change. However, based on the issues in the proposal, most concerns are around how to handle the await syntax and multiple parameters. These issues are a mute point in pipe-me, because by using the callbag spec, all of our non combining operators are single parameter, and async/await is handled by the fromIterable and fromAsync operator.

In terms of the actual operators themselves, the far majority of the magic here is possible because of André Staltz's brilliant callbag spec. Because callbags are functional compositions, and because pipeline operators are just function compositions under the hood, any callbag can be used with pipeline operators.

This actually means you can use this library with any other callbag library to unleash this awesome writing style in JS.

Inspirations

  • rxjs
  • cycle.js
  • kefir.js
  • xstream
  • elm
  • cycle-react
  • react.js

API Docs