typescript(monadic): refactor: moved the component stuff in a new file
Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
parent
4ef6660fce
commit
db5b68592c
25
typescript/monadic/src/component.ts
Normal file
25
typescript/monadic/src/component.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { IterableEmitter } from './iterableEmitter';
|
||||||
|
|
||||||
|
export type Component<T, S, A> = {
|
||||||
|
render: (state: S, dispatch: (a: A) => () => void) => T;
|
||||||
|
handleActions: (action: A, state: S) => S;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function* runComponent<T, S, A>(
|
||||||
|
component: Component<T, S, A>,
|
||||||
|
initialState: S
|
||||||
|
): AsyncGenerator<T> {
|
||||||
|
const emitter = new IterableEmitter(initialState);
|
||||||
|
|
||||||
|
const dispatch = (state: S) => (action: A) => {
|
||||||
|
const newState = component.handleActions(action, state);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
emitter.next(newState);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
for await (const state of emitter) {
|
||||||
|
yield component.render(state, dispatch(state));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
import { IterableEmitter } from './iterableEmitter';
|
import { Component, runComponent } from './component';
|
||||||
|
|
||||||
export type EnvConfig<T, S, A> = {
|
export type EnvConfig<T, S, A> = {
|
||||||
render: (template: T, parent: HTMLElement) => void;
|
render: (template: T, parent: HTMLElement) => void;
|
||||||
|
@ -7,30 +7,6 @@ export type EnvConfig<T, S, A> = {
|
||||||
initialState: S;
|
initialState: S;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Component<T, S, A> = {
|
|
||||||
render: (state: S, dispatch: (a: A) => () => void) => T;
|
|
||||||
handleActions: (action: A, state: S) => S;
|
|
||||||
};
|
|
||||||
|
|
||||||
async function* runComponent<T, S, A>(
|
|
||||||
component: Component<T, S, A>,
|
|
||||||
initialState: S
|
|
||||||
): AsyncGenerator<T> {
|
|
||||||
const emitter = new IterableEmitter(initialState);
|
|
||||||
|
|
||||||
const dispatch = (state: S) => (action: A) => {
|
|
||||||
const newState = component.handleActions(action, state);
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
emitter.next(newState);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
for await (const state of emitter) {
|
|
||||||
yield component.render(state, dispatch(state));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const runUi = async <T, S, A>(
|
export const runUi = async <T, S, A>(
|
||||||
config: EnvConfig<T, S, A>
|
config: EnvConfig<T, S, A>
|
||||||
): Promise<void> => {
|
): Promise<void> => {
|
||||||
|
|
Loading…
Reference in a new issue