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

automatic-transmission

v1.0.0

Published

Tree based state machine with automatic shifting.

Downloads

3

Readme

Usage


import AutomaticTransmission from './AutomaticTransmission.js';

const gearbox = {
  '/idle':{
    enter: () => console.log('Holla from /idle'),
    exit: () => console.log('K, bye from /idle'),
  },
  '/connected':{
    enter: () => console.log('Holla from /connected'),
    exit: () => console.log('K, bye from /connected'),
  },
  '/connected/front': {
    enter: () => console.log('Holla from /connected/front'),
    exit: () => console.log('K, bye from /connected/front'),
  },
  '/connected/front/danger': {
    enter: () => console.log('Holla from /connected/front/danger'),
    exit: () => console.log('K, bye from /connected/front/danger'),
  },
  '/connected/settings': {
    enter: () => console.log('Holla from /connected/settings'),
    exit: () => console.log('K, bye from /connected/settings'),
  },
  '/connected/worker': {
    enter: () => console.log('Holla from /connected/worker'),
    exit: () => console.log('K, bye from /connected/worker'),
  },
  '/disconnected':{
    enter: () => console.log('Holla from /disconnected'),
    exit: () => console.log('K, bye from /disconnected'),
  },
  '/error':{
    enter: () => console.log('Holla from /error'),
    exit: () => console.log('K, bye from /error'),
  },
}
const transmission = new AutomaticTransmission(gearbox, '/idle');

transmission.shift('/connected/front');
transmission.shift('/connected/front/danger');
transmission.shift('/disconnected');
Holla from /idle
K, bye from /idle
Holla from /connected
Holla from /connected/front
Holla from /connected/front/danger
K, bye from /connected/front/danger
K, bye from /connected/front
K, bye from /connected
Holla from /disconnected

relative(from, to) Explanation:

Splitting and Filtering Paths:

We first split both the from and to path strings into arrays of path segments, using / as a delimiter. .filter(o => o.trim().length) ensures that any empty segments are removed, so we only work with meaningful parts of the path.

Checking if Paths are Identical:

If both paths have the same segments, it returns an empty string, indicating no traversal is needed as we're already at the same point in the state tree.

Building Full Paths:

For both paths, we build full path arrays (fullFrom and fullTo) that represent the path from the root of the tree to each part of the path. reduce is used here to create these paths by iteratively constructing the path segment by segment.

Calculating Exit and Enter Paths:

Exit Paths: Find paths where from and to start to differ, and prepare to "exit" by reversing from the last differing point back to where they meet the 'root'. Enter Paths: Find where the to path diverges and create a sequence to "enter" or move towards the new path state.

Output:

The result is two arrays (exit, enter) that tell us how to move from the from state to the to state in terms of leaving one set of path states and entering another.