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"); const subj2 = observe(({ next, complete }) => { [1, 2, 3, 4, 5].forEach(next); complete(); }).pipe(self => ({ next, complete, error }) => { t.comment("subj2: subscribe"); const h = self.subscribe({ next: val => { if (val % 2 === 0) next("odd"); else next("even"); }, complete, error }); return () =>{ t.comment("subj2: unsubscribe"); h.unsubscribe(); }; }); subj2.subscribe({ next: val => t.comment("subj2: ", val), complete: () => t.comment("subj2: complete") }); subj2.subscribe({ next: val => t.comment("subj2: ", val), complete: () => t.comment("subj2: complete") });