This commit is contained in:
Morten Olsen
2023-03-28 08:10:46 +02:00
parent 9b1a067d56
commit 7adf03c83f
44 changed files with 1780 additions and 411 deletions

View File

@@ -1,15 +1,15 @@
import { Observable } from "./observable";
import { getCollectionItems } from "./utils";
import { Observable } from './observable';
import { getCollectionItems } from './utils';
describe("observable", () => {
it("should be able to create an observable", async () => {
describe('observable', () => {
it('should be able to create an observable', async () => {
const observable = new Observable(() => Promise.resolve(1));
expect(observable).toBeDefined();
const data = await observable.data;
expect(data).toBe(1);
});
it("should be able to combine observables", async () => {
it('should be able to combine observables', async () => {
const observable1 = new Observable(() => Promise.resolve(1));
const observable2 = new Observable(() => Promise.resolve(2));
const combined = Observable.combine({ observable1, observable2 });
@@ -18,7 +18,7 @@ describe("observable", () => {
expect(data.observable2).toBe(2);
});
it("should be able to update observable", async () => {
it('should be able to update observable', async () => {
const observable = new Observable(() => Promise.resolve(1));
const data = await observable.data;
expect(data).toBe(1);
@@ -27,20 +27,20 @@ describe("observable", () => {
expect(data2).toBe(2);
});
it("should be able to extract collection items", async () => {
it('should be able to extract collection items', async () => {
const observable = new Observable(() =>
Promise.resolve([
new Observable(() => Promise.resolve(1)),
new Observable(() => Promise.resolve(2)),
new Observable(() => Promise.resolve(3)),
])
]),
);
const flatten = observable.pipe(getCollectionItems);
const data = await flatten.data;
expect(data).toEqual([1, 2, 3]);
});
it("should update observable when subscribed", async () => {
it('should update observable when subscribed', async () => {
const observable = new Observable(() => Promise.resolve(1));
const spy = jest.fn();
observable.subscribe(spy);
@@ -50,7 +50,7 @@ describe("observable", () => {
expect(spy).toHaveBeenCalledTimes(1);
});
it("should update combined observable when subscribed", async () => {
it('should update combined observable when subscribed', async () => {
const observable1 = new Observable(() => Promise.resolve(1));
const observable2 = new Observable(() => Promise.resolve(2));
const combined = Observable.combine({ observable1, observable2 });

View File

@@ -1,2 +1,2 @@
export { Observable } from "./observable";
export { getCollectionItems } from "./utils";
export { Observable } from './observable';
export { getCollectionItems } from './utils';

View File

@@ -58,7 +58,7 @@ class Observable<T> {
};
static combine = <U extends Record<string, Observable<any>>>(
record: U
record: U,
): Observable<ObservableRecord<U>> => {
const loader = () =>
Object.entries(record).reduce(
@@ -66,7 +66,7 @@ class Observable<T> {
...(await accP),
[key]: await value.data,
}),
{} as any
{} as any,
);
const observable = new Observable<ObservableRecord<U>>(loader);
Object.values(record).forEach((item) => {
@@ -76,6 +76,16 @@ class Observable<T> {
});
return observable;
};
static link = <T>(observables: Observable<any>[], generate: () => Promise<T>) => {
const observable = new Observable<T>(generate);
observables.forEach((item) => {
item.subscribe(() => {
observable.recreate();
});
});
return observable;
};
}
export { Observable };

View File

@@ -1,4 +1,4 @@
import { Observable } from "./observable";
import { Observable } from './observable';
const getCollectionItems = async <T>(items: Observable<T>[]) => {
return Promise.all(items.map((item) => item.data));