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

sots

v4.0.4

Published

Sequence of Time Segments

Downloads

8

Readme

sots

sots (Sequence of Time Segments) is a node module that allows you to structure complex sequences of time segments. By chaining sots' add and group methods, a complex sequence can be created with little development time on your end.

sots is capable of being stateful relative to individual time segments, states can be momentary or non-momentary. When setting states, you can use a string or a number type. And when its a number type you have the option to set sots' to use the Bitwise AND comparison operator. This is beneficial, if for instance, you're setting states using binary Enums.

GitHub license npm version

Install

npm

npm install sots

yarn

yarn add sots

link: yarnpkg.com/en/package/sots

Explanation of Basic Usage

First, create an instance of Sequencer. Here it is given a period of 1 second, which will program it to emit every second:

let seq: Sequencer = new Sequencer({ period: 1000 });

When building your sequence, the only two "build" methods are: add and group. And the only two types of time segments are CountdownSegment and CountupSegment. Here CountdownSegment is passed into add method with a span of 5 seconds:

seq.add(CountdownSegment, { duration: 5000 });

Now we can subscribe and perform a start call:

seq.subscribe((value: TimeEmission) => {
  console.log(value);
});
seq.start();

This example's coalesced code:

let seq: Sequencer = new Sequencer({ period: 1000 });
seq.add(CountdownSegment, { duration: 5000 });
seq.subscribe((value: TimeEmission) => {
  console.log(value);
});
seq.start();

Definitions

  • instant - These states are momentary, as they are emitted only at a specific instant in time. The time value needs to be defined in units of a second. A value can have a modulo operator prefixed in the form of (mod[n] or %[n]) that will be applied to its segment. See Example 3 on how this is used.

  • spread - These states are non-momentary, as they "spread" over time until termination of its time segment. The time value needs to be defined in units of a second.

  • duration - Defines the length of a segment defined in milliseconds.

  • period - As defined the same as in RxJS; the unit of time between emissions defined in milliseconds.

API

The 2 build methods for creating a sequence are the following:

  • add<T extends TimeSegment>(ctor: SegmentType<T>, config: SegmentConfigShape): T The first parameter can only take: CountdownSegment or CountupSegment class type. The second parameter configures this segment's duration, to be used with bitwise operator, states, and a flag to indicate to be omitted in first interval. In addition to this method, there is a static version of this that's identical. This static version is used inside group parentheses.

  • group<T extends TimeSegment>(intervals?: number, ...segments: GroupParameter<T>[]): T Used to create groups, a.k.a intervals. The first parameter specifies the number of intervals and the second takes static calls of add. See add API for more information.

The 3 control methods for iterating a sots' sequence, are the following:

  • start(): void - Starts sequence or if sots is paused will resume sequence.

  • pause(): void - Pauses the running sequence. Since this has idempotent behavior, a call to start is needed to restart/resume the sequence.

  • reset(): void - Can only be used if subscribe has been called with an observer. This method will unsubscribe and subscribe the sequence. See Example 3 on how this is being used.

The only method (2 overloads) for subscribing to a sots' sequence, are the following:

  • subscribe(next?: (value: TimeEmission) => void, error?: (error: any) => void, complete?: () => void): Subscription - In order to make observations of sots' emissions, this is needed to be called. See 'Explanation of Basic Usage' section on how this is called with value for its next parameter.

  • subscribe(observer: PartialObserver<TimeEmission>): Subscription - Used when a sequence will be needed to reset. The observer parameter must have the same shape as PartialObserver<TimeEmission>. See Example 3 on how this is used.

The emitted value (TimeEmission) has 1 property method:

  • valueOf: (state?: string | number, compareAsBitwise?: boolean) => boolean | number - When called with a value for state, this method will return a boolean value of true if found. If this method is called with no value, then all numeric states totaled for this emission will be returned. See Example 3 on how this is used both with and without arguments.

Examples

The following are links to examples using sots.

Example 1

This example contains:

  • add call with descending segment having an instant state named 'Started!'.

  • add call with ascending segment having an instant state named 'Halfway'.

  • A callback function subscribe for the completed notification that will output: 'play audible for completed'

See this example here: example-1.ts

Example 2

This example contains:

  • Usage of binary Enum for states by setting the compareAsBitwise to true in sequencer config. You can override sequencer's compareAsBitwise by setting compareAsBitwise on individual segments if needed.

  • omitFirst being used to omit the first segment of the first interval in the group. This is beneficial when using sots for an interval timer for physical activity. When joining a descending segment typically used for to "count down" before the activity, a rest segment is typically followed. It would be awkward to have 2 consecutive counting down segments before activity, thus you can omit it with omitFirst set to true.

  • add call with descending time having an instant state and spread state. Followed by,

  • group call that creates intervals of its add methods being passed into it. Followed by,

  • add call with ascending time having an instant state and spread state.

  • A callback function subscribe for the completed notification

See this example here: example-2.ts

Example 3

This example is derived from example 2 and in an addition demonstrates the usage of control methods:

  • The JS setTimeout will be used to call the following methods in sequential order: start, pause, reset, and start .

  • A shape of PartialObserver<TimeEmission> is passed in subscribe since in this example resetting is performed.

  • This example is also using valueOf with and without arguments.

  • The mod (modulo) operator is being used in the first segment to have an instant state of AppStates.Beep be applied to every whole second.

See this example here: example-3.ts

Example 4

This example demonstrates an infinite sequence:

  • By setting the duration to Number.MAX_SAFE_INTEGER.

  • A shape of PartialObserver<TimeEmission> (versus Observer<TimeEmission>) is passed in subscribe since the complete callback is not needed.

  • The mod (modulo) operator is repeatedly used.

See this example here: example-4.ts

Issues

Please add any feedback, requests and/or bugs in the issues section of this repository.