diff options
Diffstat (limited to 'src/lib/rx.ts')
-rw-r--r-- | src/lib/rx.ts | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/src/lib/rx.ts b/src/lib/rx.ts index 1b41c27..bf01b6d 100644 --- a/src/lib/rx.ts +++ b/src/lib/rx.ts @@ -1,41 +1,48 @@ -// Html +// [1.0.1] 2023-02-13 -export interface Html { - type: 'Tag' | 'WithVar' -} +// Html -export interface Tag extends Html { +export type Html + = false + | undefined + | string + | number + | Tag + | WithVar<any> + | Array<Html> + | Rx<Html> + +interface Tag { type: 'Tag' tagName: string attributes: Attributes - children?: Array<Child> + children?: Array<Html> onmount?: (element: Element) => void onunmount?: (element: Element) => void } -export interface WithVar<A> extends Html { +interface WithVar<A> { type: 'WithVar' init: A - getChildren: (v: Var<A>, update: (f: (value: A) => A) => void) => Child + getChildren: (v: Var<A>, update: (f: (value: A) => A) => void) => Html } interface Attributes { [key: string]: Rx<AttributeValue> | AttributeValue } -export type AttributeValue +type AttributeValue = string | number | boolean | ((event: Event) => void) | ((element: Element) => void) -export type Child = false | undefined | string | number | Html | Rx<Child> | Array<Child> - -function isChild(x: any): x is Child { +function isHtml(x: any): x is Html { return (typeof x === 'string' || typeof x === 'number' - || isHtml(x) + || isTag(x) + || isWithVar(x) || isRx(x) || Array.isArray(x)) } @@ -44,8 +51,8 @@ type ValueOrArray<T> = T | Array<ValueOrArray<T>> export function h( tagName: string, - x?: Attributes | Child, - ...children: Array<Child> + x?: Attributes | Html, + ...children: Array<Html> ): Tag { if (x === undefined || x === false) { return { @@ -53,7 +60,7 @@ export function h( tagName, attributes: {} } - } else if (isChild(x)) { + } else if (isHtml(x)) { return { type: 'Tag', tagName, @@ -82,7 +89,7 @@ export function h( } } -export function withVar<A>(init: A, getChildren: (v: Var<A>, update: (f: (value: A) => A) => void) => Child): WithVar<A> { +export function withVar<A>(init: A, getChildren: (v: Var<A>, update: (f: (value: A) => A) => void) => Html): WithVar<A> { return { type: 'WithVar', init, @@ -115,7 +122,7 @@ class Var<A> extends Rx<A> { } } -export class Map<A, B> extends Rx<B> { +class Map<A, B> extends Rx<B> { readonly type: 'Map' readonly rx: Rx<A> readonly f: (value: A) => B @@ -128,7 +135,7 @@ export class Map<A, B> extends Rx<B> { } } -export class FlatMap<A, B> extends Rx<B> { +class FlatMap<A, B> extends Rx<B> { readonly type: 'FlatMap' readonly rx: Rx<A> readonly f: (value: A) => Rx<B> @@ -143,9 +150,9 @@ export class FlatMap<A, B> extends Rx<B> { // Mount -export function mount(child: Child): Cancelable { +export function mount(html: Html): Cancelable { const state = new State() - let appendRes = appendChild(state, document.body, child) + let appendRes = appendChild(state, document.body, html) return appendRes.cancel } @@ -258,7 +265,7 @@ interface AppendResult { lastAdded?: Node } -function appendChild(state: State, element: Element, child: Child, lastAdded?: Node): AppendResult { +function appendChild(state: State, element: Element, child: Html, lastAdded?: Node): AppendResult { if (Array.isArray(child)) { let cancels: Array<Cancelable> = [] let removes: Array<Removable> = [] @@ -335,7 +342,7 @@ function appendChild(state: State, element: Element, child: Child, lastAdded?: N remove: voidRemove, lastAdded: rxBase } - const cancelRx = rxRun(state, child, (value: Child) => { + const cancelRx = rxRun(state, child, (value: Html) => { appendRes.cancel() appendRes.remove() appendRes = appendChild(state, element, value, rxBase) @@ -362,10 +369,6 @@ function appendChild(state: State, element: Element, child: Child, lastAdded?: N } } -function isHtml<A>(x: any): x is Html { - return isTag<A>(x) || isWithVar<A>(x) -} - function isTag<A>(x: any): x is Tag { return x !== undefined && x.type === "Tag" } |