0.1.3 • Published 9 years ago

worldview v0.1.3

Weekly downloads
13
License
MIT
Repository
github
Last release
9 years ago

worldview

A small library for managing a nested global state object with listeners.

  • uses global immutable data structure to hold state
  • uses dot notation to refer to nested path (e.g. 'things.like.this')
  • batches updates using requestAnimationFrame/setImmediate/setTimeout
  • atomic updates by passing a function
  • read-only cursors
  • writable cursors
  • compound cursors
  • derived values with function
  • cursor/compound/derived values can be nested arbitarily (hopefully)
  • can efficiently listen for changes on any of the above
  • works in browser or in node/io
  • written in es6, babel'd to es5
  • no dependencies
  • exploratory/experimental state, use cautiously in production

Examples

Update a simple value

var world = require('worldview');

world.listen(function(state){
  console.log('the state of the world is', state);
});

world.update('name', 'Earth');

Use all the cool things at once

var world = require('worldview');

// readonly cursors
var nick = world.at('people.nick');
var peter = world.at('people.peter');

// they keys a/b let me refer to them in the listener by key
var nickAndPeter = world.compound({ a: nick, b: peter });

var derived = nickAndPeter.derive(function(obj){
  // it will be initialized with { a: undefined, b: undefined }
  // I'm not sure if this is a good thing or not
  if (obj.a && obj.b) {
    return 'nick is ' + obj.a.age + ' and peter is ' + obj.b.age;
  }
});

// these will get called whenever people.nick or people.peter changes
// after having been run through the derivation function above
derived.listen(function(status){
  console.log('status:', status);
});

// these updates will be batched
world.update('people.nick', { age: 31 });
world.update('people.peter', { age: 35 });

setTimeout(function(){
  // 10 years passes...
  world.update('people.nick', { age: 41 });
  world.update('people.peter', { age: 45 });
}, 1000);

What do you mean by efficient updates?

Well, it uses immutable values so all comparisons are just object identity ones. These are very fast. This means trees can be diff'd very quickly, but I also traverse the trees with the listeners, if there are no listeners for that part of the tree we don't need to even do the object comparisons.

To achieve this the listeners are stored globally, this also means they can be combined so there is no penalty for having lots of listeners on the same path, the time to find the listeners only grows with the number of unique paths being listened on.

How to use it?

npm install worldview
var world = require('worldview');
// ... etc
0.1.3

9 years ago

0.1.2

9 years ago

0.1.1

9 years ago

0.1.0

9 years ago

0.0.7

9 years ago

0.0.6

9 years ago

0.0.5

9 years ago

0.0.4

9 years ago

0.0.3

9 years ago

0.0.2

9 years ago

0.0.1

9 years ago