diff --git a/typescript/monadic/src/component.ts b/typescript/monadic/src/component.ts new file mode 100644 index 0000000..d0fa2f3 --- /dev/null +++ b/typescript/monadic/src/component.ts @@ -0,0 +1,25 @@ +import { IterableEmitter } from './iterableEmitter'; + +export type Component = { + render: (state: S, dispatch: (a: A) => () => void) => T; + handleActions: (action: A, state: S) => S; +}; + +export async function* runComponent( + component: Component, + initialState: S +): AsyncGenerator { + 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)); + } +} diff --git a/typescript/monadic/src/environment.ts b/typescript/monadic/src/environment.ts index 2a1bf14..0701917 100644 --- a/typescript/monadic/src/environment.ts +++ b/typescript/monadic/src/environment.ts @@ -1,4 +1,4 @@ -import { IterableEmitter } from './iterableEmitter'; +import { Component, runComponent } from './component'; export type EnvConfig = { render: (template: T, parent: HTMLElement) => void; @@ -7,30 +7,6 @@ export type EnvConfig = { initialState: S; }; -export type Component = { - render: (state: S, dispatch: (a: A) => () => void) => T; - handleActions: (action: A, state: S) => S; -}; - -async function* runComponent( - component: Component, - initialState: S -): AsyncGenerator { - 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 ( config: EnvConfig ): Promise => {