1.0.39 • Published 8 months ago

rivarjs v1.0.39

Weekly downloads
-
License
ISC
Repository
-
Last release
8 months ago

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;
1.0.39

8 months ago

1.0.38

8 months ago

1.0.33

8 months ago

1.0.36

8 months ago

1.0.35

8 months ago

1.0.34

8 months ago

1.0.22

2 years ago

1.0.21

2 years ago

1.0.20

2 years ago

1.0.26

2 years ago

1.0.25

2 years ago

1.0.24

2 years ago

1.0.23

2 years ago

1.0.29

2 years ago

1.0.28

2 years ago

1.0.27

2 years ago

1.0.32

2 years ago

1.0.31

2 years ago

1.0.30

2 years ago

1.0.19

2 years ago

1.0.18

2 years ago

1.0.17

2 years ago

1.0.16

2 years ago

1.0.15

2 years ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago