From c3a5520b420ac9ccffa406dec7c5b87a448b1222 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 6 Feb 2016 00:12:45 +0100 Subject: [PATCH] Eliminated (I)ObservableValue.observe --- package.json | 3 +- src/api/observe.ts | 33 +++++++------- src/types/observablevalue.ts | 5 +-- test/errorhandling.js | 2 +- test/makereactive.js | 8 ++-- test/observables.js | 87 ++++++++++++++++++------------------ test/perf/perf.js | 14 +++--- test/typescript-tests.ts | 4 +- test/untracked.js | 2 +- 9 files changed, 79 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index 5136e9d71..6e5599a0c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "lib/index.js", "typings": "lib/index.d.ts", "scripts": { - "test": "npm run buildtest && tape test/*.js | faucet", + "test": "npm run buildtest && npm run tape", + "tape": "tape test/*.js | faucet", "test-browser": "npm run buildtest && ( browserify test/*.js | tape-run )", "test-travis": "npm run clean && npm run test-browser && istanbul cover tape test/*.js", "coverage": "npm run buildtest && istanbul cover tape test/*.js && cat ./coverage/lcov.info|coveralls", diff --git a/src/api/observe.ts b/src/api/observe.ts index 20e02e0ee..550f58500 100644 --- a/src/api/observe.ts +++ b/src/api/observe.ts @@ -20,10 +20,6 @@ export function observe(thing, property?, listener?): Lambda { listener = property; property = undefined; } - if (typeof thing === "function") { - console.error("[mobservable.observe] is deprecated in combination with a function, use 'mobservable.autorun' instead"); - return autorun(thing); - } if (isObservableArray(thing)) return thing.observe(listener); if (isObservableMap(thing)) { @@ -43,19 +39,24 @@ export function observe(thing, property?, listener?): Lambda { } return thing.$mobservable.observe(listener); } - if (thing instanceof ObservableValue || thing instanceof ComputedValue) { - let firstTime = true; - let prevValue = undefined; - return autorun(() => { - let newValue = thing.get(); - if (!firstTime || fireImmediately) { - listener(newValue, prevValue); - } - firstTime = false; - prevValue = newValue; - }); - } + if (thing instanceof ObservableValue || thing instanceof ComputedValue) + return observeObservableValue(thing, listener, fireImmediately); + if (thing.$mobservable instanceof ObservableValue || thing.$mobservable instanceof ComputedValue) + return observeObservableValue(thing.$mobservable, listener, fireImmediately); if (isPlainObject(thing)) return (observable(thing)).$mobservable.observe(listener); throw new Error("[mobservable.observe] first argument should be an observable array, observable map, observable object, observable value, computed value or plain object."); +} + +function observeObservableValue(observable: ObservableValue|ComputedValue, listener: (newValue: T, oldValue: T) => void, fireImmediately?: boolean): Lambda { + let firstTime = true; + let prevValue = undefined; + return autorun(() => { + let newValue = observable.get(); + if (!firstTime || fireImmediately) { + listener(newValue, prevValue); + } + firstTime = false; + prevValue = newValue; + }); } \ No newline at end of file diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 252c3469a..def500510 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -43,13 +43,13 @@ export class ObservableValue { } } +// TODO: deprecate? export interface IObservableValue { (): T; (value: T): void; - // TODO: remove observe: - observe(callback: (newValue: T, oldValue: T) => void, fireImmediately?: boolean): Lambda; } +// TODO: deprecate? export function toGetterSetterFunction(observable: ObservableValue | ComputedValue): IObservableValue { const f: any = function(value?) { if (arguments.length > 0) @@ -58,7 +58,6 @@ export function toGetterSetterFunction(observable: ObservableValue | Compu return observable.get(); }; f.$mobservable = observable; - f.observe = observe.bind(null, observable); // TODO: remove observe? f.toString = function() { return observable.toString(); }; diff --git a/test/errorhandling.js b/test/errorhandling.js index acc0b00e2..5640b7095 100644 --- a/test/errorhandling.js +++ b/test/errorhandling.js @@ -153,7 +153,7 @@ test('cycle3', function(t) { var a = observable(function() { return z() ? 1 : b() * 2; }); var b = observable(function() { return a() * 2; }); - b.observe(voidObserver); + m.observe(b, voidObserver); t.equal(1, a()); t.throws(() => { diff --git a/test/makereactive.js b/test/makereactive.js index aa755f123..dc049ea82 100644 --- a/test/makereactive.js +++ b/test/makereactive.js @@ -155,9 +155,9 @@ test('observable4', function(t) { ]); var b = buffer(); - m.observable(function() { + m.observe(m.observable(function() { return x.map(function(d) { return d.x }); - }).observe(b, true); + }), b, true); x[0].x = 3; x.shift(); @@ -171,9 +171,9 @@ test('observable4', function(t) { ])); var b2 = buffer(); - m.observable(function() { + m.observe(m.observable(function() { return x2.map(function(d) { return d.x }); - }).observe(b2, true); + }), b2, true); x2[0].x = 3; x2.shift(); diff --git a/test/observables.js b/test/observables.js index e130c51ce..657d9b8e5 100644 --- a/test/observables.js +++ b/test/observables.js @@ -1,6 +1,6 @@ var test = require('tape'); var mobservable = require('..'); -var m = mobservable.observable; +var m = mobservable; var observable = mobservable.observable; var transaction = mobservable.transaction; @@ -18,9 +18,9 @@ function buffer() { } test('basic', function(t) { - var x = m(3); + var x = observable(3); var b = buffer(); - x.observe(b); + m.observe(x, b); t.equal(3, x()); x(5); @@ -35,7 +35,7 @@ test('basic2', function(t) { var z = observable(function () { return x() * 2}); var y = observable(function () { return x() * 3}); - z.observe(voidObserver); + m.observe(z, voidObserver); t.equal(z(), 6); t.equal(y(), 9); @@ -50,13 +50,12 @@ test('basic2', function(t) { test('dynamic', function(t) { try { - var x = m(3); - var y = m(function() { + var x = observable(3); + var y = observable(function() { return x(); }); var b = buffer(); - debugger; - y.observe(b, true); + m.observe(y, b, true); t.equal(3, y()); // First evaluation here.. @@ -82,7 +81,7 @@ test('dynamic2', function(t) { t.equal(9, y()); var b = buffer(); - y.observe(b); + m.observe(y, b); x(5); t.equal(25, y()); @@ -111,7 +110,7 @@ test('readme1', function(t) { return order.price() * (1+vat()); }); - order.priceWithVat.observe(b); + m.observe(order.priceWithVat, b); order.price(20); t.deepEqual([24],b.toArray()); @@ -131,7 +130,7 @@ test('batch', function(t) { var c = observable(function() { return a() * b() }); var d = observable(function() { return c() * b() }); var buf = buffer(); - d.observe(buf); + m.observe(d, buf); a(4); b(5); @@ -222,7 +221,7 @@ test('scope', function(t) { }; var order = new Order(); - order.total.observe(voidObserver); + m.observe(order.total, voidObserver); order.price(10); order.amount(3); t.equal(36, order.total()); @@ -412,7 +411,7 @@ test('observe object', function(t) { a: 1, da: function() { return this.a * 2 } }); - var stop = a.$mobservable.observe(function(change) { + var stop = m.observe(a, function(change) { events.push(change); }); @@ -515,7 +514,7 @@ test('change count optimization', function(t) { return b(); }); - c.observe(voidObserver); + m.observe(c, voidObserver); t.equal(b(), 4); t.equal(c(), 4); @@ -546,7 +545,7 @@ test('observables removed', function(t) { t.equal(calcs, 0); - c.observe(voidObserver); + m.observe(c, voidObserver); t.equal(c(), 4); t.equal(calcs, 1); a(2); @@ -605,7 +604,7 @@ test('lazy evaluation', function (t) { return b() * 2; }); - var handle = d.observe(function() { + var handle = m.observe(d, function() { observerChanges += 1; }, false); t.equal(bCalcs,4); @@ -643,13 +642,13 @@ test('lazy evaluation', function (t) { test('multiple view dependencies', function(t) { var bCalcs = 0; var dCalcs = 0; - var a = m(1); - var b = m(function() { + var a = observable(1); + var b = observable(function() { bCalcs++; return 2 * a(); }); - var c = m(2); - var d = m(function() { + var c = observable(2); + var d = observable(function() { dCalcs++; return 3 * c(); }) @@ -689,21 +688,21 @@ test('multiple view dependencies', function(t) { }) test('nested observable2', function(t) { - var factor = m(0); - var price = m(100); + var factor = observable(0); + var price = observable(100); var totalCalcs = 0; var innerCalcs = 0; - var total = m(function() { + var total = observable(function() { totalCalcs += 1; // outer observable shouldn't recalc if inner observable didn't publish a real change - return price() * m(function() { + return price() * observable(function() { innerCalcs += 1; return factor() % 2 === 0 ? 1 : 3; })(); }); var b = []; - var sub = total.observe(function(x) { b.push(x); }, true); + var sub = m.observe(total, function(x) { b.push(x); }, true); price(150); factor(7); // triggers innerCalc twice, because changing the outcome triggers the outer calculation which recreates the inner calculation @@ -720,21 +719,21 @@ test('nested observable2', function(t) { }) test('expr', function(t) { - var factor = m(0); - var price = m(100); + var factor = observable(0); + var price = observable(100); var totalCalcs = 0; var innerCalcs = 0; - var total = m(function() { + var total = observable(function() { totalCalcs += 1; // outer observable shouldn't recalc if inner observable didn't publish a real change - return price() * m(function() { + return price() * observable(function() { innerCalcs += 1; return factor() % 2 === 0 ? 1 : 3; })(); }); var b = []; - var sub = total.observe(function(x) { b.push(x); }, true); + var sub = m.observe(total, function(x) { b.push(x); }, true); price(150); factor(7); // triggers innerCalc twice, because changing the outcome triggers the outer calculation which recreates the inner calculation @@ -751,8 +750,8 @@ test('expr', function(t) { }) test('observe', function(t) { - var x = m(3); - var x2 = m(function() { return x() * 2; }); + var x = observable(3); + var x2 = observable(function() { return x() * 2; }); var b = []; var cancel = mobservable.autorun(function() { @@ -770,7 +769,7 @@ test('observe', function(t) { }) test('when', function(t) { - var x = m(3); + var x = observable(3); var called = 0; mobservable.autorunUntil(function() { @@ -792,7 +791,7 @@ test('when', function(t) { }) test('when 2', function(t) { - var x = m(3); + var x = observable(3); var called = 0; mobservable.autorunUntil(function() { @@ -811,12 +810,12 @@ test('when 2', function(t) { }) test('expr2', function(t) { - var factor = m(0); - var price = m(100); + var factor = observable(0); + var price = observable(100); var totalCalcs = 0; var innerCalcs = 0; - var total = m(function() { + var total = observable(function() { totalCalcs += 1; // outer observable shouldn't recalc if inner observable didn't publish a real change return price() * mobservable.expr(function() { innerCalcs += 1; @@ -825,7 +824,7 @@ test('expr2', function(t) { }); var b = []; - var sub = total.observe(function(x) { b.push(x); }, true); + var sub = m.observe(total, function(x) { b.push(x); }, true); price(150); factor(7); // triggers innerCalc twice, because changing the outcome triggers the outer calculation which recreates the inner calculation @@ -842,7 +841,7 @@ test('expr2', function(t) { }) test('json1', function(t) { - var todos = m([ + var todos = observable([ { title: "write blog" }, @@ -888,14 +887,14 @@ test('json2', function(t) { t.deepEqual(mobservable.toJSON(o), source); - var analyze = m(function() { + var analyze = observable(function() { return [ o.todos.length, o.todos[1].details.url ] }); - var alltags = m(function() { + var alltags = observable(function() { return o.todos.map(function(todo) { return todo.tags.join(","); }).join(","); @@ -904,8 +903,8 @@ test('json2', function(t) { var ab = []; var tb = []; - analyze.observe(function(d) { ab.push(d); }, true); - alltags.observe(function(d) { tb.push(d); }, true); + m.observe(analyze, function(d) { ab.push(d); }, true); + m.observe(alltags, function(d) { tb.push(d); }, true); o.todos[0].details.url = "boe"; o.todos[1].details.url = "ba"; @@ -1192,7 +1191,7 @@ test('verify transaction events', function(t) { }); test("verify array in transaction", function(t) { - var ar = m([]); + var ar = observable([]); var aCount= 0; var aValue; diff --git a/test/perf/perf.js b/test/perf/perf.js index f9f7220ba..b0138fcf8 100644 --- a/test/perf/perf.js +++ b/test/perf/perf.js @@ -45,7 +45,7 @@ test('one observes ten thousand that observe one', function (t) { var start = now(); - b.observe(voidObserver, true); // start observers + mobservable.observe(b, voidObserver, true); // start observers t.equal(99990000, b()); var initial = now(); @@ -70,7 +70,7 @@ test('five hundrend properties that observe their sibling', function (t) { var start = now(); var last = observables[observables.length -1]; - last.observe(voidObserver); + mobservable.observe(last, voidObserver); t.equal(501, last()); var initial = now(); @@ -95,7 +95,7 @@ test('late dependency change', function(t) { return sum; }) - sum.observe(voidObserver, true); + mobservable.observe(sum, voidObserver, true); var start = new Date(); @@ -130,7 +130,7 @@ test('lots of unused computables', function(t) { }); var sum = 0; - var subscription = b.observe(function(newValue) { + var subscription = mobservable.observe(b, function(newValue) { sum = newValue; }, true); @@ -182,7 +182,7 @@ test('array reduce', function(t) { return a + c * b(); }, 0); }); - sum.observe(voidObserver); + mobservable.observe(sum, voidObserver); var start = now(); @@ -220,7 +220,7 @@ test('array classic loop', function(t) { s+=ar[i] * b(); return s; }); - sum.observe(voidObserver, true); // calculate + mobservable.observe(sum, voidObserver, true); // calculate var start = now(); @@ -287,7 +287,7 @@ function order_system_helper(t, usebatch, keepObserving) { var disp; if (keepObserving) - disp = totalAmount.observe(voidObserver); + disp = mobservable.observe(totalAmount, voidObserver); var start = now(); diff --git a/test/typescript-tests.ts b/test/typescript-tests.ts index 9d55d42ee..3faf0582c 100644 --- a/test/typescript-tests.ts +++ b/test/typescript-tests.ts @@ -1,14 +1,14 @@ /// /// import { - observable, asStructure, autorun, autorunAsync, extendObservable, + observe, observable, asStructure, autorun, autorunAsync, extendObservable, IObservableArray, IArrayChange, IArraySplice, IObservableValue, extras } from "../lib/index"; import * as test from 'tape'; var v = observable(3); -v.observe(() => {}); +observe(v, () => {}); var a = observable([1,2,3]); diff --git a/test/untracked.js b/test/untracked.js index df013196b..e34df4340 100644 --- a/test/untracked.js +++ b/test/untracked.js @@ -13,7 +13,7 @@ test('untracked 1', function(t) { }); var result; - var d = m.observe(function() { + var d = m.autorun(function() { dCalcs++; result = c(); });