import { observe } from "./observable"; import * as t from "tap"; const subj1 = observe(({ next, complete }) => { next(1); complete(); next(2); }); const consumer1 = { sum: 0, next(v: number) { this.sum += v; } }; subj1.subscribe(consumer1); t.equal(consumer1.sum, 1, "Should get only one value"); subj1.subscribe(consumer1); t.equal(consumer1.sum, 2, "Should get the value again"); const consumer2 = { value: 0, completed: false, next(v: number) { this.value = v; }, complete() { this.completed = true; } }; let maps = 0; subj1 .map(v => { t.comment(`map1: ${v * 2}`); maps++; return v * 2; }) .map (v => { t.comment(`map2: ${v * 2}`); maps++; return v * 2; }) .map(v => { t.comment(`map3: ${v * 2}`); maps++; return v * 2; }) .subscribe(consumer2); t.equal(consumer2.value, 8, "Should map"); t.equal(maps, 3, "The map chain should not be executed after completion"); t.ok(consumer2.completed, "The completion signal should pass through");