watchables

Watchable value abstraction

Watchables

Library defines watchable value abstraction, in form of three polymorphic methods, where each one can be extended per type.

watchables/watchers module provides method that has no default implementation and supposed to be defined per type that wishes to implement this watchable abstraction:

var watchers = require("watchables/watchers")
function Type() { /* ... */ }
watchers.define(Type, function(value) {
  // return array of registered observes for the given value, 
  // wthich is instance of `Type`. 
})

watchables/watch module provides polymorphic method that comes with a default implementation. Given that it's called with a value that implements watchers method and a observer function, it will register given observer for the value unless it's already being registered. Method can be defined for a specific type to better reflect it's needs.

var watch = require("wathchables/watch")
watch(new Type(), function() {
  console.log("!!!!")
})

Method can also be extended with a type specific implementation.

var watch = require("wathchables/watch")
watch.define(Type, function(valuelistener) {
  var listeners = value._listeners
  if (typeof(listeners) === "")
    value._listeners = listener
  else if (typeof(listeners) === "function")
    value._listeners = [value._listeners, listener]
  else
    listeners.push(listener)
})

watchables/unwatch module provides polymorphic method that comes with a default implementation. Given that it's called with a value that implements watchers method and a observer function, it will unregister given observer for the value, if it's registered.

var unwatch = require("wathchables/unwatch")
unwatch(value, myListener)

Method can be extended with a type specific implementation.

var unwatch = require("wathchables/unwatch")
unwatch.define(Type, function(valuelistener) {
  var listeners = value._listeners
  var index = -1
  if (typeof(listeners) === "function") {
    if (listeners === listener) value._listeners = void(0)
  } else if (listeners && ~(index = listeners.indexOf(listener))) {
    if (listeners.length === 2) {
      value._listeners = index === 0 ? listeners[1] : listeners[0]
    } else {
      listeners.splice(index, 1)
    }
  }
  return value
})
 
npm install watchables