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

graflow

v0.3.2

Published

A graph stream library for Javascript

Downloads

3

Readme

graflow

npm version Standard - JavaScript Style Guide Build Status

graflow is a stream library for Javascript where flow is defined as a graph. It's small and has no dependencies.

Why graflow?

There are many stream libraries for Javascript, for example RxJS, most, bacon. They are very good but most of them don't support cycles in stream flow. So if you need a cycle, you need a proxy or a workaround like that (see cycle). However cycles aren't something strange in graflow, since you define stream flow like a graph.

On the other hand, most stream libraries use to define data flow through method chaining. graflow defines data flow declaratively, through a data structure: a graph. And you can apply many transformations or opeations to a graph, for example, you could convert the graph into a diagram or apply automatic optimizatins or verifications.

Installation

graflow is packaged as an UMD module and you can find it at npm repository. It works on node.js and moder browsers.

You can use at node.js

npm install graflow

or at your browser through bower

bower install graflow

or loading graph.js or graph.min.js (/dist directory) directly

<script src="graflow.min.js"></script>

Usage

graflow is a set of component factories, that is functions that return a new component. By convention, every factory name is capitalized. Don't use new keyword with graflow factories.

You can think about a component like a blackbox that receive async signals and outputs async signals. It's like a microchip in a electric circuit.

A component example:

  import { Component, Mapper, Filter } from 'graflow'

  const myComponent = Component({
    components: {
      inc: Mapper(v => v + 1),
      limit: Filter(v => v <= 5)
    },
    connections: [
      ['in', 'inc'],
      ['inc', 'limit'],
      ['limit', 'out'],
      ['limit', 'inc']
    ]
  })

  myComponent.on(console.log)
  myComponent.send(2)

Try it online! The result is:

  3
  4
  5

myComponent receive an input (2) and emit values up to 5. It doesn't look awesome, I know. But this is just little example. The important things here are:

  • Async inputs/outputs (from, item).
  • Cycles easily made (inc->limit->inc).
  • Declarative way: a graph (inputs, outputs, components are nodes, connections are edges).
  • Easy to compose (map and filter are just components, like myComponent).
  • Easy to sketch graphically.

example01 diagram

Note that previous example can be coded in a shorter way:

  import Component from 'graflow'

  const myComponent = Component((v, next) => {
    for(let i = v+1; i<=5; i++) next(i)
  })

  myComponent.on(console.log)
  myComponent.send(2)

Component

A graflow component is an object with async inputs and outputs (also called ports). Every component has at least a default input and a default output.

You can send messages to component with send method:

  • send(port, value): port is the name of the input you send the value.
  • send(value): send to default input.
  • send(): send default value {} to default input.

You can listen to component outputs with on method:

  • on(port, listener): port is the name of the output that listener function is listenning.
  • on(listener): listen to default output.

API

Logger(options={})

Creates a component that takes the input (default input), logs it and finally outputs it (default output).

Arguments:

  • options:
    • log: A function that takes the input value (default: console.log).
    • prefix: If specified, a value passed to log function before the input value.

Projects using graflow

TODO

  • [ ] Better documentation
  • [ ] More component factories
  • [ ] More tests
  • [ ] Performance tests