Skip to content

Commit

Permalink
Update Bee API
Browse files Browse the repository at this point in the history
  • Loading branch information
bigslycat committed Oct 19, 2018
1 parent 35b8035 commit 6d6138e
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 26 deletions.
41 changes: 39 additions & 2 deletions packages/honeycombs/src/Bee.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
/* @flow */

import type { ObserverInterface, ObservableInterface } from 'es-observable';
import $$observable from 'symbol-observable';

import type {
Subscription,
ObserverInterface,
ObservableInterface,
} from 'es-observable';

import { StoreObservable } from './StoreObservable';
import { StateSubject } from './StateSubject';
import { type Runner } from './Queue';
import { Store, type StoreLike } from './Store';

export class Bee<S, P> extends StoreObservable<S>
class BeeSubject<S, P> extends StoreObservable<S>
implements ObservableInterface<S>, StoreLike<S>, ObserverInterface<P> {
#run /* : Runner<P> */;

Expand All @@ -21,3 +27,34 @@ export class Bee<S, P> extends StoreObservable<S>
run(payload);
}
}

export type Bee<S, P> = {
(payload: P): void,
next(payload: P): void,
getState(): S,
+subscribe: ((
next: (S) => void,
error?: (Error) => void,
complete?: () => void,
) => Subscription<S>) &
((observer: ObserverInterface<S>) => Subscription<S>),
};

export const of = <S, P>(
store: Store<S>,
subject: StateSubject<S>,
run: Runner<P>,
): Bee<S, P> => {
const beeSubject = new BeeSubject(store, subject, run);

const bee = (payload: P): void => beeSubject.next(payload);

bee.next = (payload: P): void => beeSubject.next(payload);
bee.getState = (): S => beeSubject.getState();
bee.subscribe = (n: any, e, c) => beeSubject.subscribe(n, e, c);

// $FlowFixMe
bee[$$observable] = beeSubject[$$observable]();

return bee;
};
32 changes: 13 additions & 19 deletions packages/honeycombs/src/Honeycomb.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,44 +55,42 @@ class Honeycomb<S> extends StoreObservable<S>
};
}

bee<P>(handler: P => (S => S) | S): Bee<S, P> {
apply<P>(handler: P => (S => S) | S): bee.Bee<S, P> {
return this.case(handler);
}

case<P>(handler: P => (S => S) | S): Bee<S, P> {
case<P>(handler: P => (S => S) | S): bee.Bee<S, P> {
const createCaseEmitters = this.#createCaseEmitters;
const { queue, store, caseSubject, next } = createCaseEmitters();
return new Bee(store, caseSubject, queue.case(handler, next));
return bee.of(store, caseSubject, queue.case(handler, next));
}

always(payload: S): Bee<S, void> {
always(payload: S): bee.Bee<S, void> {
return this.case(() => payload);
}

just(): Bee<S, S> {
just(): bee.Bee<S, S> {
return this.case(payload => payload);
}

willBee<P>(handler: P => Promise<(S => S) | S>): Bee<S, P> {
return this.fromPromise(handler);
}

fromPromise<P>(handler: P => Promise<(S => S) | S>): Bee<S, P> {
fromPromise<P>(handler: P => Promise<(S => S) | S>): bee.Bee<S, P> {
const createCaseEmitters = this.#createCaseEmitters;
const { queue, store, caseSubject, next, error } = createCaseEmitters();
return new Bee(store, caseSubject, queue.fromPromise(handler, next, error));
return bee.of(store, caseSubject, queue.fromPromise(handler, next, error));
}

willBees<P>(handler: P => ObservableInterface<(S => S) | S>): Bee<S, P> {
return this.fromObservable(handler);
}

fromObservable<P>(
handler: P => ObservableInterface<(S => S) | S>,
): Bee<S, P> {
fromObservable<P>(handler: P => ObservableLike<(S => S) | S>): bee.Bee<S, P> {
const createCaseEmitters = this.#createCaseEmitters;
const { queue, store, caseSubject, next, error } = createCaseEmitters();
return new Bee(
return bee.of(
store,
caseSubject,
queue.fromObservable(handler, next, error),
Expand All @@ -103,24 +101,20 @@ class Honeycomb<S> extends StoreObservable<S>
return this.awaitPromise(handler);
}

awaitPromise<P>(handler: (S, P) => Promise<S>): Bee<S, P> {
awaitPromise<P>(handler: (S, P) => Promise<S>): bee.Bee<S, P> {
const createCaseEmitters = this.#createCaseEmitters;
const { queue, store, caseSubject, next, error } = createCaseEmitters();
return new Bee(
store,
caseSubject,
queue.awaitPromise(handler, next, error),
);
return bee.of(store, caseSubject, queue.awaitPromise(handler, next, error));
}

awaitBees<P>(handler: (S, P) => ObservableInterface<S>): Bee<S, P> {
return this.awaitObservable(handler);
}

awaitObservable<P>(handler: (S, P) => ObservableInterface<S>): Bee<S, P> {
awaitObservable<P>(handler: (S, P) => ObservableLike<S>): bee.Bee<S, P> {
const createCaseEmitters = this.#createCaseEmitters;
const { queue, store, caseSubject, next, error } = createCaseEmitters();
return new Bee(
return bee.of(
store,
caseSubject,
queue.awaitObservable(handler, next, error),
Expand Down
8 changes: 3 additions & 5 deletions packages/honeycombs/src/Queue.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
/* @flow */

import $$observable from 'symbol-observable';
import type { ObservableInterface } from 'es-observable';
import type { ObservableLike } from 'es-observable';

import { Store } from './Store';

export type Task<S> = S => ObservableInterface<S> | Promise<S> | S;

export type Runner<P> = (payload: P) => void;

const getState = <S>(store: Store<S>): S => store.getState();
Expand Down Expand Up @@ -54,7 +52,7 @@ export class Queue<S> {
}

fromObservable<P>(
handler: P => ObservableInterface<(S => S) | S>,
handler: P => ObservableLike<(S => S) | S>,
next: S => void,
error: Error => void,
) {
Expand All @@ -78,7 +76,7 @@ export class Queue<S> {
}

awaitObservable<P>(
handler: (S, P) => ObservableInterface<S>,
handler: (S, P) => ObservableLike<S>,
next: S => void,
error: Error => void,
) {
Expand Down

0 comments on commit 6d6138e

Please sign in to comment.