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

rivarjs

v1.0.39

Published

Reactive Instance Variable

Downloads

441

Readme

rivarjs

Reactive Instance Variable for JavaScript based on rxjs

rivarjs is a decentralized state management library that automates changes. It harmonizes concepts from the object-oriented programming (OOP) and functional reactive programming (FRP) paradigms. The heart of rivarjs lies in the innovative RIVar datatype. RIVar stands for Reactive Instance Variable. This combines reactive variable from FRP with instance variable (i.e., object's variable) from OOP.

The API

1. Variables

var myRIVar=new RIVar();

2. Lift

var functionOverRIVars=lift((x, y) => x * y, firstRIVar, secondRIVar);

3. Assignments

myRIVar.set(functionOverRIVars);

It is usually prefered to compose this with the previous step: myRIVar.set(lift((x, y) => x * y, firstRIVar, secondRIVar))

Design & Philosophy

Assignments are extend-only operators and do not override previous assignments. Also, cycles (mutual recursion, that variables are declared in terms of each other) are allowed and correct. As a result, classes of OOP with private assignments can be easily extended.

How it Works

Each variable is implemented as an observable stream from RxJS. Also the assigned expressions for these variables are implemented as observable streams. The observable stream of a variable is created from merging the observable streams of the whole assigned expressions.

Examples

Composition

 class A {
    constructor() {
      this.firstRIVar = new RIVar();   
      // you may assign this.firstRIVar
    }
  }

 class B {
    constructor(a) {

      this.a = a;

      this.secondRIVar = new RIVar();
      this.thirdRIVar = new RIVar();
     
      this.a.firstRIVar.set(lift(mul, this.secondRIVar, this.thirdRIVar));

    }
  }

Inheritance

 class A {
    constructor() {
      this.firstRIVar = new RIVar();   
      // you may assign this.firstRIVar
    }
  }

 class B extends A {

    constructor(a) {

      this.secondRIVar = new RIVar();
      this.thirdRIVar = new RIVar();
     
      this.FirstRIVar.set(lift(mul, this.secondRIVar, this.thirdRIVar));

    }
  }

Integration

React

RIVarView is a React component to render according to a rivar

import { RIVarView } from 'rivarjs/integration/react';

RIVarView takes prop rivar and children prop of a render function. The render function returns JSX of a react component according to value (at the time of rendering) and change (to transfer changes from events to the rivar).


  <RIVarView rivar={rivar}>
    {({ value, change }) => {
      return <input
        type="number"
        value={value}
        onChange={(event) => change(event.target.value)}
      />;
    }}
  </RIVarView>

Pure JavaScript

The following code initiates a connection between an instance of RIVar to an HTML element.

    function bind(inputID, variable) {

      var input = document.getElementById(inputID);

      input.addEventListener('input', (event) => {
        const value = event.target.value;
        variable.next(new Signal(value));
        input.style.fontStyle = "normal";
      });

      variable.subscribe((signal) => {
        if (input.value !== signal.value.toString()) {
          input.value = signal.value.toString();
          input.style.fontStyle = "italic";
        }
      });

    }

Installation

To use rivarjs, you have two options. First, you can install it using npm by running the following command:

npm install rivarjs

Alternatively, for an HTML page, you need to include the rivarjs script and its required dependency, RxJS, by adding the following script tags:

<script src="https://unpkg.com/rxjs@^7/dist/bundles/rxjs.umd.min.js"></script>
<script src="https://unpkg.com/rivarjs/dist/rivar.umd.js"></script>

Once you have rivarjs available, you can import the necessary elements in your JavaScript code using the following syntax:

var { RIVar, lift, Signal } = rivarjs;